Trigger分三類(lèi): Property trigger: dependency property改變時(shí)觸發(fā)。對(duì)應(yīng)的Trigger類(lèi)。比較Property和Value的值,如果相同,則觸發(fā),如不同不觸發(fā)或撤消更改。常見(jiàn)的例子是用bool值作觸發(fā)條件,但是請(qǐng)記得,只要Property和Value值相同就會(huì)觸發(fā),并不一定必須使用如IsMouseOver這樣的bool值。 Data trigger:普通的.net屬性改變時(shí)觸發(fā)。對(duì)應(yīng)的DataTrigger類(lèi)。使用 DataTrigger,可以在數(shù)據(jù)對(duì)象的屬性值與指定的 Value 匹配時(shí)設(shè)置屬性值。例如,在顯示 Employee 對(duì)象列表時(shí),可能希望前景色根據(jù)每個(gè) Employee 的當(dāng)前出勤情況而變化。(例如,用紫色前景色顯示當(dāng)前正在休假的 Employee。) 在有些情況下,創(chuàng)建轉(zhuǎn)換器或使用 DataTemplateSelector 可能會(huì)更適合。有關(guān)更多信息,請(qǐng)參見(jiàn) 數(shù)據(jù)模板化概述。 Data trigger適用于數(shù)據(jù)綁定的情況。 Event trigger: 由事件觸發(fā)。對(duì)應(yīng)的是EventTrigger類(lèi)。與上面兩個(gè)Trigger不一樣的是,Event trigger不會(huì)在條件不滿(mǎn)足時(shí)撤消操作。 請(qǐng)注意,使用 EventTrigger 時(shí),需要選擇不會(huì)影響控件內(nèi)在行為的事件??丶ɡ?Button 或 TextBox)執(zhí)行有關(guān)用戶(hù)輸入事件(如鼠標(biāo)單擊和鍵盤(pán)事件)的特定操作。例如,如果要對(duì)按鈕進(jìn)行樣式設(shè)置,并嘗試將 MouseDown 事件設(shè)置為 EventTrigger 的 RoutedEvent,則永遠(yuǎn)也不會(huì)應(yīng)用 EventTrigger,因?yàn)樵撌录⑹紫冉?jīng)過(guò)按鈕的處理??梢愿挠?PreviewMouseDown 事件或其他事件。 由于以上三個(gè)Trigger都是繼承自TriggerBase類(lèi),所以也都有EnterActions和ExitActions屬性,分別記錄Trigger變?yōu)榛顒?dòng)狀態(tài)時(shí)及變?yōu)榉腔顒?dòng)狀態(tài)時(shí)的TriggerAction 對(duì)象的集合,而這兩個(gè)屬性是對(duì)Event trigger不適用的。 Property trigger: <Style x:Key="buttonStyle" TargetType="{x:Type Button}"> Data trigger: <StackPanel Width="200"> <StackPanel.Resources> <Style TargetType="{x:Type TextBox}"> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="disabled"> <Setter Property="IsEnabled" Value="False"/> </DataTrigger> </Style.Triggers> <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/> </Style> </StackPanel.Resources> <TextBox Margin="3"/> </StackPanel>
Event Trigger: <Style TargetType="Rectangle"> <Setter Property="Width" Value="50" /> <Setter Property="Height" Value="50" /> <Setter Property="Margin" Value="20" /> <Setter Property="HorizontalAlignment" Value="Left" /> <Style.Triggers> <EventTrigger RoutedEvent="MouseEnter"> <BeginStoryboard> <Storyboard> <DoubleAnimation To="300" Duration="0:0:1.5" AccelerationRatio="0.10" DecelerationRatio="0.25" Storyboard.TargetProperty="(Canvas.Width)" /> </Storyboard> </BeginStoryboard> </EventTrigger> <EventTrigger RoutedEvent="MouseLeave"> <BeginStoryboard> <Storyboard> <DoubleAnimation Duration="0:0:1.5" AccelerationRatio="0.10" DecelerationRatio="0.25" Storyboard.TargetProperty="(Canvas.Width)" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Style.Triggers> </Style> Trigger中“與”“或”邏輯的表示“或”邏輯很簡(jiǎn)單,只要對(duì)同一對(duì)象上設(shè)置多個(gè)trigger就可以 <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="RenderTransform"> <Setter.Value> <RotateTransform Angle="10"/> </Setter.Value> </Setter> <Setter Property="Foreground" Value="Black"/> </Trigger> <Trigger Property="IsFocused" Value="True"> <Setter Property="RenderTransform"> <Setter.Value> <RotateTransform Angle="10"/> </Setter.Value> </Setter> <Setter Property="Foreground" Value="Black"/> </Trigger> </Style.Triggers> “與”操作時(shí),需要用到MultiTrigger和MultiDataTrigger(兩者也都繼承于TriggerBase),兩者的區(qū)別就像Trigger和DataTrigger一樣?!芭c”的判斷是通過(guò)Conditions對(duì)象來(lái)判斷的,只有Conditions中計(jì)算出來(lái)都為true時(shí)才能觸發(fā): <Style.Triggers> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Background" Value="#EEEEEE" /> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="HasItems" Value="false" /> <Condition Property="Width" Value="Auto" /> </MultiTrigger.Conditions> <Setter Property="MinWidth" Value="120"/> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="HasItems" Value="false" /> <Condition Property="Height" Value="Auto" /> </MultiTrigger.Conditions> <Setter Property="MinHeight" Value="95"/> </MultiTrigger> </Style.Triggers>
MultriDataTrigger: <Window.Resources> <c:Places x:Key="PlacesData"/> <Style TargetType="ListBoxItem"> <Style.Triggers> <DataTrigger Binding="{Binding Path=State}" Value="WA"> <Setter Property="Foreground" Value="Red" /> </DataTrigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Path=Name}" Value="Portland" /> <Condition Binding="{Binding Path=State}" Value="OR" /> </MultiDataTrigger.Conditions> <Setter Property="Background" Value="Cyan" /> </MultiDataTrigger> </Style.Triggers> </Style> <DataTemplate DataType="{x:Type c:Place}"> <Canvas Width="160" Height="20"> <TextBlock FontSize="12" Width="130" Canvas.Left="0" Text="{Binding Path=Name}"/> <TextBlock FontSize="12" Width="30" Canvas.Left="130" Text="{Binding Path=State}"/> </Canvas> </DataTemplate> </Window.Resources> <StackPanel> <TextBlock FontSize="18" Margin="5" FontWeight="Bold" HorizontalAlignment="Center">Data Trigger Sample</TextBlock> <ListBox Width="180" HorizontalAlignment="Center" Background="Honeydew" ItemsSource="{Binding Source={StaticResource PlacesData}}"/> </StackPanel> |
|
來(lái)自: 悟靜 > 《.net和asp.net》