【C#】WPF的xaml中定義的Trigger為什麼有時候會不管用,如Border的MouseOver之類的
阿新 • • 發佈:2019-01-22
初學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介面的一個教程。