WPF?Trigger改變屬性無效問題排查示例詳解
WPF Trigger改變屬性無效問題排查
- WPF 使用trigger改變這個按鈕的顏色,結(jié)果發(fā)現(xiàn)實際沒有生效。第一眼感覺很奇怪,后來一想確實是這樣,因為組件設(shè)置的優(yōu)先級問題,直接在控件設(shè)置比模板里的設(shè)置屬性的優(yōu)先級高,覆蓋了模板的設(shè)置。
<Button Button.Name="PART_DropDownButton" Foreground="Blue"> <Control.Template> <ControlTemplate ControlTemplate.TargetType="{x:Type Button}"> <Border FrameworkElement.Cursor="Hand"> <Grid> <Path x:Name="filterIcon" Width="16" Height="16" Margin="0,0,0,0" Fill="{TemplateBinding Foreground}" Path.Data="M3.42591 3H12.5741C12.6566 3 12.7373 3.02543 12.8065 3.07319C12.8756 3.12095 12.9302 3.189 12.9636 3.26905C12.997 3.3491 13.0077 3.43772 12.9945 3.52413C12.9813 3.61054 12.9447 3.69102 12.8892 3.75579L9.38851 7.84104C9.31723 7.92421 9.27774 8.03258 9.27774 8.14498V11.3432C9.27774 11.4176 9.26043 11.4909 9.22735 11.5564C9.19426 11.622 9.14642 11.6779 9.08808 11.7192L7.38443 12.9241C7.32028 12.9695 7.24574 12.9955 7.16874 12.9995C7.09174 13.0034 7.01517 12.9851 6.9472 12.9465C6.87923 12.9079 6.82241 12.8505 6.78279 12.7803C6.74318 12.7102 6.72226 12.6299 6.72226 12.5482V8.14498C6.72226 8.03258 6.68277 7.92421 6.61149 7.84104L3.11076 3.75579C3.05526 3.69102 3.01869 3.61054 3.00549 3.52413C2.99229 3.43772 3.00303 3.3491 3.03641 3.26905C3.06979 3.189 3.12437 3.12095 3.19352 3.07319C3.26267 3.02543 3.3434 3 3.42591 3Z" Stretch="None" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="Red" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Control.Template> </Button>
那么怎么修改呢
最簡單的就是增加style
在style里設(shè)置這個默認的字色
<Button Button.Name="PART_DropDownButton"> <Button.Style> <Style TargetType="Button"> <Setter Property="Foreground" Value="Blue" /> </Style> </Button.Style> <Control.Template> ... 代碼省略 </Control.Template> </Button>
搞定。
直接修改模板里的顏色值為固定值
其實還有很多修改方式,比如說,直接修改模板里的顏色值為固定值,不使用TemplateBinding,在這里也能解決問題,但是實際開發(fā)中擴展性會有點問題;另外一種就是使用附加屬性,附加屬性,附加屬性不定義在宿主內(nèi)部,一般定義在公共的類中,提供給全局使用,所以,如果你想定制一個樣式,設(shè)置某兩個屬性,但是控件不支持時,可以使用附加屬性在style的模板中使用改屬性,這樣可以兼容統(tǒng)一樣式和個別自定義樣式的修改需求。只是解決這個問題是顯得太復(fù)雜了,不過可以了解下用途,下面來簡單介紹下,
// 從這里可以看出你可以定制各種各樣的屬性,來改變控件的樣式,圓角,顏色等等 public class ControlAttachProperty { #region 圓角 public static CornerRadius GetCornerRadius(DependencyObject obj) { return (CornerRadius)obj.GetValue(CornerRadiusProperty); } public static void SetCornerRadius(DependencyObject obj, CornerRadius value) { obj.SetValue(CornerRadiusProperty, value); } public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.RegisterAttached("CornerRadius", typeof(CornerRadius), typeof(ControlAttachProperty), new PropertyMetadata(null)); #endregion #region 附加顏色1 public static SolidColorBrush GetAttachColor(DependencyObject obj) { return (SolidColorBrush)obj.GetValue(AttachColorProperty); } public static void SetAttachColor(DependencyObject obj, SolidColorBrush value) { obj.SetValue(AttachColorProperty, value); } public static readonly DependencyProperty AttachColorProperty = DependencyProperty.RegisterAttached("AttachColor", typeof(SolidColorBrush), typeof(ControlAttachProperty), new PropertyMetadata(null)); #endregion #region 附加顏色2 public static SolidColorBrush GetAttachColor1(DependencyObject obj) { return (SolidColorBrush)obj.GetValue(AttachColor1Property); } public static void SetAttachColor1(DependencyObject obj, SolidColorBrush value) { obj.SetValue(AttachColor1Property, value); } public static readonly DependencyProperty AttachColor1Property = DependencyProperty.RegisterAttached("AttachColor1", typeof(SolidColorBrush), typeof(ControlAttachProperty), new PropertyMetadata(null)); #endregion #region 附加圖片資源 public static ImageSource GetAttachImageSource(DependencyObject obj) { return (ImageSource)obj.GetValue(AttachImageSourceProperty); } public static void SetAttachImageSource(DependencyObject obj, ImageSource value) { obj.SetValue(AttachImageSourceProperty, value); } public static readonly DependencyProperty AttachImageSourceProperty = DependencyProperty.RegisterAttached("AttachImageSource", typeof(ImageSource), typeof(ControlAttachProperty), new PropertyMetadata(null)); #endregion }
在style中定義過濾按鈕的樣式,默認的話黑色,當(dāng)鼠標(biāo)懸浮的時候是綠色。這是系統(tǒng)的統(tǒng)一樣式。
<Window.Resources> <Style x:Key="FilterButton" TargetType="{x:Type Button}"> <Setter Property="local:ControlAttachProperty.AttachColor" Value="Black" /> <Setter Property="local:ControlAttachProperty.AttachColor1" Value="Green" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate ControlTemplate.TargetType="{x:Type Button}"> <Border FrameworkElement.Cursor="Hand"> <Grid> <Path x:Name="filterIcon" Width="16" Height="16" Margin="0,0,0,0" Fill="{TemplateBinding local:ControlAttachProperty.AttachColor}" Path.Data="M3.42591 3H12.5741C12.6566 3 12.7373 3.02543 12.8065 3.07319C12.8756 3.12095 12.9302 3.189 12.9636 3.26905C12.997 3.3491 13.0077 3.43772 12.9945 3.52413C12.9813 3.61054 12.9447 3.69102 12.8892 3.75579L9.38851 7.84104C9.31723 7.92421 9.27774 8.03258 9.27774 8.14498V11.3432C9.27774 11.4176 9.26043 11.4909 9.22735 11.5564C9.19426 11.622 9.14642 11.6779 9.08808 11.7192L7.38443 12.9241C7.32028 12.9695 7.24574 12.9955 7.16874 12.9995C7.09174 13.0034 7.01517 12.9851 6.9472 12.9465C6.87923 12.9079 6.82241 12.8505 6.78279 12.7803C6.74318 12.7102 6.72226 12.6299 6.72226 12.5482V8.14498C6.72226 8.03258 6.68277 7.92421 6.61149 7.84104L3.11076 3.75579C3.05526 3.69102 3.01869 3.61054 3.00549 3.52413C2.99229 3.43772 3.00303 3.3491 3.03641 3.26905C3.06979 3.189 3.12437 3.12095 3.19352 3.07319C3.26267 3.02543 3.3434 3 3.42591 3Z" Stretch="None" /> <Path x:Name="filterIcon_mouseover" Width="16" Height="16" Margin="0,0,0,0" Fill="{TemplateBinding local:ControlAttachProperty.AttachColor1}" Path.Data="M3.42591 3H12.5741C12.6566 3 12.7373 3.02543 12.8065 3.07319C12.8756 3.12095 12.9302 3.189 12.9636 3.26905C12.997 3.3491 13.0077 3.43772 12.9945 3.52413C12.9813 3.61054 12.9447 3.69102 12.8892 3.75579L9.38851 7.84104C9.31723 7.92421 9.27774 8.03258 9.27774 8.14498V11.3432C9.27774 11.4176 9.26043 11.4909 9.22735 11.5564C9.19426 11.622 9.14642 11.6779 9.08808 11.7192L7.38443 12.9241C7.32028 12.9695 7.24574 12.9955 7.16874 12.9995C7.09174 13.0034 7.01517 12.9851 6.9472 12.9465C6.87923 12.9079 6.82241 12.8505 6.78279 12.7803C6.74318 12.7102 6.72226 12.6299 6.72226 12.5482V8.14498C6.72226 8.03258 6.68277 7.92421 6.61149 7.84104L3.11076 3.75579C3.05526 3.69102 3.01869 3.61054 3.00549 3.52413C2.99229 3.43772 3.00303 3.3491 3.03641 3.26905C3.06979 3.189 3.12437 3.12095 3.19352 3.07319C3.26267 3.02543 3.3434 3 3.42591 3Z" Stretch="None" Visibility="Collapsed" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="filterIcon_mouseover" Property="Visibility" Value="Visible" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources>
// 按鈕使用 <Grid> <Button Button.Name="PART_DropDownButton" Style="{StaticResource FilterButton}" /> </Grid>
那么如果有個需求:有一個要默認藍色,懸浮紅色呢,只要
使用按鈕的時候使用如下代碼即可,這樣就可以實現(xiàn)了樣式的統(tǒng)一和個性簡單的定制。
<Button local:ControlAttachProperty.AttachColor="Blue" local:ControlAttachProperty.AttachColor1="Red" Button.Name="PART_DropDownButton" Style="{StaticResource FilterButton}" />
以上就是WPF Trigger改變屬性無效問題排查示例詳解的詳細內(nèi)容,更多關(guān)于WPF Trigger屬性無效排查的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
總結(jié)C#動態(tài)調(diào)用WCF接口的兩種方法
這篇文章給大家總結(jié)了C#動態(tài)調(diào)用WCF接口的兩種方法,大家可以根據(jù)自己的需求選擇對應(yīng)的方式,下面來一起看看。2016-09-09基于C#實現(xiàn)WinForm開發(fā)操作系統(tǒng)的文件管理系統(tǒng)代碼
基于C#的WinForm應(yīng)用程序來模擬操作系統(tǒng)文件管理系統(tǒng),可以幫助用戶在Windows環(huán)境下進行文件的創(chuàng)建、移動、刪除與搜索等操作,這種模擬工具有助于學(xué)習(xí)文件系統(tǒng)的工作原理以及測試和開發(fā)其他軟件項目2024-12-12