WPF 雜談——Trigger觸發器

筆者在使用的WPF過程當中,見過的觸發器有三種:Trigger、DataTrigger、EventTrigger。其中最爲經常使用的要屬Trigger。至於觸發器的做用就是當某個屬性的值發生變化,應該去作某事。固然這是筆者自身的理解。比較簡單。那麼這三者之間有什麼不一樣呢?這即是這章要討論的目地。WPF的Style筆者喜歡把他看做CSS的樣式。那麼Trigger觸發器大家能夠理解爲CSS樣式中相似於:hover 僞類。這樣子筆者作一個列子吧。以下,當鼠標移動在文本上面的,前景色變成爲紅色。字體

<Grid>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
</Grid>

執行結果動畫

鼠標移在上面spa

相信從上面的例子你至少能夠明白觸發器的做用。並且做用還不小呢?好了。這一點筆者就不須要在重複的去講解了。那麼DataTrigger又跟Trigger有什麼區別呢?能夠說做用上來說沒有什麼區別,可是在面向對象倒是不同子的。Trigger都是專對於控件自身的依賴屬性(dependency properties)。DataTrigger是通常專對於另的控件的屬性,並且都是用綁定來實現的。以下面的例子。3d

    <Grid>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </Grid>

那麼例子的效果跟上一例子同樣子。代碼上面也沒有多大的差異。主要是修改了觸發器的寫法而以。可是咱們要認識到一點:Trigger通常都是跟屬性直接關聯。而DataTrigger是經過綁定來關聯。因此DataTrigger通常用於寫另外一個控件上的屬性在當前控件的觸發效果。固然也能夠綁定自身,如上。那麼在舉一個綁定另外一個控件的屬性吧。以下code

<StackPanel Orientation="Vertical">
        <ToggleButton Name="Changer" Content="變紅" Width="75" Height="30"></ToggleButton>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked, ElementName= Changer}" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>

執行結果:對象

最後一個Eventtrigger通常用於動畫效果的處理。上面倆個觸發器做用對象都是屬性。而這個倒是做用於事件的。表示當前某個事件發生後要觸發。筆者本身寫例子太麻煩了。就到國外複製一個例子過來講明。以下blog

    <StackPanel Orientation="Vertical">
        <TextBlock Text="I am Aomi" HorizontalAlignment="Center">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                            <EventTrigger RoutedEvent="MouseEnter">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0.300" Storyboard.TargetProperty="FontSize" To="28" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                            <EventTrigger RoutedEvent="MouseLeave">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0.800" Storyboard.TargetProperty="FontSize" To="18" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>

例子的功能很簡單就是當鼠標進入到文字區域的時候文字變大到28字體。若是離開就變成18字體。事件

執行效果:get

上面的觸發器應該來說算是比較簡單而又經常使用。但是都是單個觸發條件。咱們在編寫業務代碼的時候,每每能夠存在多個條件下的觸發效果。因此上面的Trigger和DataTrigger就不能知足需求了。爲了這種狀況,WPF爲Trigger提供了MultiTrigger,爲DataTrigger提供了MultiDataTrigger。除了語法上有必定的區別之外,效果是同樣子的。以下it

 <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsEnabled" Value="True" />
                                <Condition Property="IsMouseOver" Value="True" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="#4d4d4d" />
                        </MultiTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>

從上面咱們能夠看到Condition就是多條件。用法用單條件是同樣子的。

執行效果:

最後讓咱們看一下MultiDataTrigger的用法吧。以下

<TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding IsChecked,ElementName=Changer  }" Value="True" />
                                <Condition Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self} }" Value="True" />
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Foreground" Value="Red" />
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>

執行效果:

相關文章
相關標籤/搜索