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

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...

Více

1. Pro následující situace označte barvu, jakou bude mít

1. Pro následující situace označte barvu, jakou bude mít