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>

執行結果

鼠標移在上面

相信從上面的例子你至少可以明白觸發器的作用。而且作用還不小呢?好了。這一點筆者就不需要在重復的去講解了。那么DataTrigger又跟Trigger有什么區別呢?可以說作用上來講沒有什么區別,但是在面向對象卻是不一樣子的。Trigger都是專對於控件自身的依賴屬性(dependency properties)。DataTrigger是一般專對於另的控件的屬性,而且都是用綁定來實現的。如下面的例子。

    <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一般用於寫另一個控件上的屬性在當前控件的觸發效果。當然也可以綁定自身,如上。那么在舉一個綁定另一個控件的屬性吧。如下

<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一般用於動畫效果的處理。上面倆個觸發器作用對象都是屬性。而這個卻是作用於事件的。表示當前某個事件發生后要觸發。筆者自己寫例子太麻煩了。就到國外復制一個例子過來說明。如下

    <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字體。

執行效果:

上面的觸發器應該來講算是比較簡單而又常用。可是都是單個觸發條件。我們在編寫業務代碼的時候,往往可以存在多個條件下的觸發效果。所以上面的Trigger和DataTrigger就不能滿足需求了。為了這種情況,WPF為Trigger提供了MultiTrigger,為DataTrigger提供了MultiDataTrigger。除了語法上有一定的區別以外,效果是一樣子的。如下

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

執行效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM