Trigger - vjj root page
Transkript
Trigger - vjj root page
events, triggers .NET 24.1.16 vjj 1 events, properties, data • Co mají společného ? • lze definovat reakci na • • • • 24.1.16 událost určitou hodnotu vlastnosti hodnotu dat Čím se liší ? • • • • • zápis - syntax trigeru handler - deklarativní nebo procedurální pořadí, v jakém jsou volány příslušné handlery co vše lze pomocí nich udělat automatický návrat k původnímu stavu vjj 3 Triggers • Umožňují definovat reakci na vzniklou situaci 24.1.16 • Event Trigger – invoked when a RoutedEvent is raised " <EventTrigger … " • Property Trigger – invoked when the value of a dependency property changes " <Trigger … " • Data Trigger – invoked when the value of a plain .NET property changes vjj 4 Event Triggers 24.1.16 vjj 5 Win32 API • zprávy ve frontě • můj program • • • • • 24.1.16 GetMessage DispatchMessage -> WndClass.WndProc WndProc (id instance okna, msg) switch case vjj 6 Win32 API okno okno okno okno Win32 API program case case WinProc case case WinProc case WinProc DispatchMessage GetMessage fronta WM_ zpráv 24.1.2016 vjj 7 objektové nadstavby • zprávy ve frontě • runtime (Win32 aplikace) • • • • • • DispatchMessage -> WndClass.WndProc WndProc (id instance okna, msg) switch case můj program • 24.1.16 GetMessage event handler (pro který objekt?) vjj 8 objektový program okno okno okno okno moje objekty event handler event handler event handler event handler Win32 API stub case case WinProc case case WinProc case WinProc DispatchMessage GetMessage fronta WM_ zpráv 24.1.2016 vjj 9 přesměrování • jak zpracovat zprávu/událost jinde? • standardní ovládací prvky implementované ve standardní knihovně • reakci chci mít spojenou s oknem, ve kterém jsou ovládací prvky umístěny • runtime -> event handler objektu, kterého se událost týká 24.1.2016 vjj 10 Win32 API • Controls – child okna, pokud explicitně neupozorní rodičovské okno, to se o události nic nedozví • standardní ovládací prvky –> standardní komunikace (posílají zprávy WM_COMMAND nebo WM_NOTIFY rodičovskému oknu) 24.1.16 vjj 11 standardní objektové nadstavby • standardní ovládací prvky 24.1.2016 • pokud neobsahují příslušný event handler • pokud obsahují příslušný event handler vjj 12 .NET • objekt může mít zaregistrovaný Event handler i pro jiný typ objektu, než je jeho vlastní • pro některé události je možné zaregistrovat dokonce dva handlery najednou 24.1.2016 • Type.PreviewEventName • Type.EventName vjj 13 .NET • pro každou událost volá runtime v pevně daném pořadí handlery této události zaregistrované i u jiných objektů, než je ten, pro který byla událost vyvolána 24.1.2016 vjj 14 .NET WPF program okno okno okno moje objekty event handler event handler event handler Win32 API stub case case WinProc case case case WinProc DispatchMessage GetMessage fronta WM_ zpráv 24.1.2016 vjj 15 .NET runtime • strom objektů + zaregistrované handlery • cesta od kořene k objektu, kterého se událost týká 24.1.2016 • všechny event handlery odshora dolu - tunelování • jen event handler objektu, kterého se událost týká - direct • všechny event handlery odspodu nahoru - probublávání vjj 16 .NET event handling WM_... direct event WM_... tunneling event WM_... bubbling event object 1 event handler object 2 event handler WM_... tunneling & bubbling event preview event handler standard event handler preview event handler standard event handler preview event handler standard event handler preview event handler object 3 event handler object 4 object 5 event handler object 6 event handler 24.1.2016 preview event handler vjj 17 classic event handling • case WM_... : object event handler 24.1.2016 vjj 18 .NET event handling • case WM_... : if ( tunneling ) go to this.Parent; preview handler if ( tunneling && (e.Source != this) ) return to the child object; if ( bubbling ) handler go to the parent object; 24.1.2016 vjj 19 Routing Strategies • • • • 24.1.16 Routed events use one of three routing strategies: Direct: Only the source element itself is given the opportunity to invoke handlers in response. This is analogous to the "routing" that Windows Forms uses for events. However, unlike a standard CLR event, direct routed events support class handling and can be used by EventSetter and EventTrigger. Tunneling: Initially, event handlers at the element tree root are invoked. The routed event then travels a route through successive child elements along the route, towards the node element that is the routed event source (the element that raised the routed event). Tunneling routed events are often used or handled as part of the compositing for a control, such that events from composite parts can be deliberately suppressed or replaced by events that are specific to the complete control. Input events provided in WPF often come implemented as a tunneling/bubbling pair. Tunneling events are also sometimes referred to as Preview events, because of a naming convention that is used for the pairs. Bubbling: Event handlers on the event source are invoked. The routed event then routes to successive parent elements until reaching the element tree root. Most routed events use the bubbling routing strategy. Bubbling routed events are generally used to report input or state changes from distinct controls or other UI elements. vjj 20 Routing Strategies • DIRECT .NET runtime zavolá Event Handler pouze toho ovládacího prvku, pro který událost nastala • • TUNNELING .NET runtime postupně volá Preview Event Handler této události pro všechny nadřazené objekty od kořene vizuálního stromu až k objektu, kde událost nastala • • PreviewMouseDown BUBBLING .NET runtime postupně volá standardní Event Handler této události stejných objektů jako u tunelování, ale v opačném pořadí • 24.1.16 Click, MouseEnter MouseDown vjj 21 .NET • tunneling - pro standardní systémovou reakci • bubbling - pro speciální reakci aplikace • v dokumentaci jsou uvedeny handlery a preview handlery nezávisle na sobě, takže pro zjištění, jakou strategii volání handlerů pro událost runtime používá, je nutné zkontrolovat výskyt popisu obou těchto handlerů 24.1.2016 vjj 22 Direct Events • klasika • je volán Event handler pouze pro ovládací prvek, pro který byla událost vyvolána • pokud ten nemá pro tuto událost zaregistrován žádný handler, je událost ignorována 24.1.16 vjj 24 Direct Events • MouseEnter • MouseLeave • Click • • • 24.1.16 Button CheckBox RadioButton vjj 25 problém • sample: Button - Grid - TextBox - MouseEnter sample - Direct událost, která není Direct ?! 24.1.2016 vjj 26 Attached Events • • • • • • • • • Mouse.MouseEnter Mouse.MouseLeave Mouse.MouseLeftButtonDown Mouse.MouseLeftButtonUp Mouse.MouseRightButtonDown Mouse.MouseRightButtonUp Mouse.MouseDoubleClick Mouse.MouseMove Mouse.MouseWheel • Click • Button • CheckBox • RadioButton 24.1.16 vjj 27 tunneling • • • • • • • • • • • • 24.1.16 bubbling PreviewMouseLeftButtonDown • MouseDown • • • • • GotKeyboardFocus PreviewMouseLeftButtonUp PreviewMouseRightButtonDown PreviewMouseRightButtonUp PreviewMouseDoubleClick PreviewMouseMove PreviewMouseWheel PreviewGotKeyboardFocus PreviewLostKeyboardFocus PreviewKeyDown PreviewKeyUp PreviewTextInput vjj LostKeyboardFocus KeyDown KeyUp TextInput 28 tunneling • preview handlery jsou volány odshora dolů, tj. handler elementu, který událost vyvolal, je volán jako poslední • umožňuje umístění společného handleru pro všechny ovládací prvky do kontejneru, který je obsahuje, a upřednostnit tento globální handler před lokálními • protože událost může být vyvolána některým z "child" elementů, je vhodné zkontrolovat "Source" v datech události 24.1.16 vjj 29 bubling • bublání následuje po skončení tunelování • postupně jsou volány všechny handlery od elementu, pro který byla událost vyvolána, až do kořene stromu objektů uživatelského rozhraní • protože událost může být vyvolána některým z "child" elementů, je vhodné zkontrolovat "Source" v datech události 24.1.16 vjj 30 bubling only • GotMouseCapture • LostMouseCapture • QueryCursor 24.1.16 vjj 31 event handled • posloupnost tunelování a následného bublání lze kdykoliv ukončit private void myContainerHandler (object sender, RoutedEventArgs e) { . . . e.Handled = true ; . . . } 24.1.16 vjj 32 XAML + C# <Button Name="btnHello" Content="AAAAA" Click="btnHello_Clicked"> </Button> void btnHello_Clicked (object sender, RoutedEventArgs e) { btnHello.Content = "BBBBB"; btnHello.Background = new SolidColorBrush(Colors.GreenYellow); } 24.1.16 vjj 35 XAML: EventTrigger • Event -> code behind <Button MouseEnter="myEventHandler" ... /> • Event -> XAML EventTrigger -> actions <Button ... /> <Button.Triggers> <EventTrigger RoutedEvent="Button.MouseEnter"> Actions 24.1.16 vjj 36 XAML: EventTrigger <Button Content="Click" Height="30" Width="100" Margin="10"> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard ... /> </EventTrigger> </Button.Triggers> </Button> 24.1.16 vjj 37 XAML: EventTrigger <Button Content="Click" Height="30" Width="100" Margin="10"> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <DoubleAnimation To="150" Duration="0:0:2" AutoReverse="True" Storyboard.TargetProperty="(Button.Width)" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button> 24.1.16 vjj 38 XAML: EventTrigger <Button Content="Click" Height="30" Width="100" Margin="10"> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <EventTrigger.Actions> <BeginStoryboard ... /> ... </EventTrigger.Actions> </EventTrigger> </Button.Triggers> </Button> 24.1.16 vjj 39 triggered actions • • • 24.1.16 může být příkaz • • • • • BeginStoryboard StopStoryboard PauseStoryboard ResumeStoryboard … nebo kombinace takových příkazů možné hodnoty parametru Storyboard • • • vnořená definice scénáře animací odkaz na definici scénáře animací jinde, např. v resources odkaz na odstartovaný scénář animací vjj 40 Property Triggers 24.1.2016 vjj 41 Property Triggers • • • • 24.1.16 system watches for dependency property to have a certain value system watches for property trigger to become inactive and reverts property to the previous value Možné reakce jsou… • • • Setter - Nastavení hodnoty libovolné vlastnosti EnterActions ExitActions Property Trigger lze psát pouze jako součást definice stylu vjj 42 Property Trigger <Trigger Property="..." Value="..."> <Setter Property="..." Value="..." /> <Setter Property="..." Value="..." /> <Setter Property="..." Value="..." /> </Trigger> 24.1.16 vjj 43 XAML - IsMouseOver - syntax error <Button Content="hover over" Height="30" Width="200" Margin="10"> <Button.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="FontWeight" Value="Bold" /> </Trigger> </Button.Triggers> </Button> 24.1.16 vjj 44 Property Trigger in Style <Page.Resources> <Style TargetType="Button"> ... Control"> <Style.Triggers> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter Property="Button.FontWeight" Value="Bold" /> </Trigger> </Style.Triggers> </Style> </Page.Resources> 24.1.16 vjj 45 multiple properties <Style TargetType="Button"> <Style.Triggers> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="FontSize" Value="28"/> <Setter Property="Cursor“ Value="Hand"/> </Trigger> </Style.Triggers> </Style> 24.1.16 vjj 46 multiple triggers <Style TargetType="Button"> <Style.Triggers> <Trigger Property="Button.IsPressed" Value="True"> <Setter Property="Foreground" Value="Red"/> </Trigger> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter Property="FontWeight" Value="Bold"/> <Setter Property="FontSize" Value="28pt"/> </Trigger> </Style.Triggers> </Style> 24.1.16 vjj 47 MultiTriggers <Style TargetType="Button"> <Style.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Button.IsMouseOver" Value="True"/> <Condition Property="Button.Content" Value="HELLO"/> </MultiTrigger.Conditions> <Setter Property="Foreground" Value="Red"/> <Setter Property="FontSize" Value="28pt"/> <Setter Property="FontWeight" Value="Bold"/> </MultiTrigger> </Style.Triggers> </Style> 24.1.16 vjj 48 EventTriggers + PropertyTrigger <Style TargetType="Button"> <Style.Triggers> <EventTrigger RoutedEvent="Button.MouseEnter"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation To="150" Duration="0:0:2" Storyboard.TargetProperty="(Button.Width)" /> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> <EventTrigger RoutedEvent="Button.MouseLeave"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation To="100" Duration="0:0:2" Storyboard.TargetProperty="(Button.Width)" /> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter Property="FontWeight" Value="Bold"/> </Trigger> </Style.Triggers> </Style> 24.1.16 vjj 49 Property Trigger w/Events <Style TargetType="Button"> <Style.Triggers> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter Property="FontWeight" Value="Bold"/> <Trigger.EnterActions> <BeginStoryboard Name="ABCD" . . . . </Trigger.EnterActions> <Trigger.ExitActions> <StopStoryboard BeginStoryboardName="ABCD" /> </Trigger.ExitActions> </Trigger> </Style.Triggers> </Style> 24.1.16 vjj 50 přehled prostředí důvod handler event 24.1.16 animace změna atributu NE code behind XAML způsob reakce implicitní návrat k původní hodnotě ANO Routed Event Trigger ANO ANO AutoReverse ANO NE NE animation ANO AutoReverse ANO NE změna hodnoty atributu Property Trigger EnterActions ANO ExitActions ANO vjj ANO Setter ANO 51 DataTrigger <TextBox Margin="10" Text="White" FontSize="42"> <TextBox.Style> <Style TargetType="{x:Type TextBox}"> <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text}" /> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="disabled" > <Setter Property="IsEnabled" Value="False" /> </DataTrigger> </Style.Triggers> </Style> </TextBox.Style> </TextBox> 24.1.2016 vjj 52
Podobné dokumenty
Programování jBotBrainu II v Javě a práce s moduly
Celý program uložíme do souboru PrvniProgram.java, který vytvoříme v libovolném textovém
editoru, třeba poznámkovém bloku, který je součástí Windows. Při přepisování je potřeba dbát
na velikost pís...