1. 程式人生 > >【C#】WPF的xaml中定義的Trigger為什麼有時候會不管用,如Border的MouseOver之類的

【C#】WPF的xaml中定義的Trigger為什麼有時候會不管用,如Border的MouseOver之類的

初學WPF,知道一些控制元件可以通過定義Style的Trigger改變要顯示的樣式,但是經常遇到一些明明Trigger已經觸發了,但是裡面Setter設定的樣式,卻沒有效果的問題。其實主要原因,是樣式重複定義導致的。

舉個例子:

<Border x:Name="borderQZone" BorderBrush="Cyan" BorderThickness="0" CornerRadius="2,2,2,2" Width="20" Height="20" Style="{DynamicResource BorderStyle1}" >
              <Border.Resources>
                                    <Style x:Key="BorderStyle1" TargetType="{x:Type Border}">
                                        <Style.Triggers>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter Property="BorderThickness" Value="5"></Setter>
                                                <Setter Property="BorderBrush" Value="Red"></Setter>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </Border.Resources>
                                <StackPanel>
                                    <Image x:Name="imgQzone" Width="20" Height="20" Source="Images/qzone.png" MouseLeftButtonDown="imgQzone_MouseLeftButtonDown"/>
 
                                </StackPanel>
                            </Border>

這段程式碼,執行後,無論你滑鼠在上面經過多少次,外觀樣式都不會有任何改變。這是因為你在最外層的Border裡已經定義了BorderBrush和BroderThickness,所以Trigger中的那兩個setter不會起到任何作用,但是如果你在新增一個setter,Property設定為背景色。重新執行,你會發現這個Setter卻有作用,就是因為我們在外層的Border標籤中,沒有定義Background屬性,所以它才會有作用。

所以,到這裡你應該知道如何更改你的程式碼了,如下:

<Border Width="50" Height="50" Style="{DynamicResource BorderStyle2}">
                <Border.Resources>
                    <Style x:Key="BorderStyle2" TargetType="{x:Type Border}">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="BorderBrush" Value="Black"></Setter>
                                <Setter Property="Background" Value="Green"></Setter>
                                <Setter Property="BorderThickness" Value="6"></Setter>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="False">
                                <Setter Property="BorderBrush" Value="Blue"></Setter>
                                <Setter Property="Background" Value="Yellow"></Setter>
                                <Setter Property="BorderThickness" Value="8"></Setter>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Border.Resources>
            </Border>

另外,還需要注意,一旦定義了IsMouseOver為True的Trigger,也最好定義一個為False的Trigger。經實踐,如果只定義一個為True的,還是沒有任何現實效果。

在接下的部落格中,會為大家帶來一個用WPF做的仿QQ介面的一個教程。