我有一个从Button扩展的自定义按钮,在构造函数中我想添加IsMouseOver属性触发器来改变颜色;
请,没有任何建议"你应该在xaml ..."这不是问题。
我正在尝试以下但我有错误:
public powerButton()
{
if (DesignerProperties.GetIsInDesignMode(this) || !DesignerProperties.GetIsInDesignMode(this))
{
ApplyBackgroundStyle();
}
/*
Style style = new Style();
style.TargetType = typeof(Button);
DataTrigger trigger = new DataTrigger();
trigger.Value = "OK";
//set binding
trigger.Binding = new Binding() { Path = new PropertyPath("Content"), RelativeSource = RelativeSource.Self };
Setter setter = new Setter();
setter.Property = Button.IsMouseOverProperty;
setter.Value = Brushes.Green;
trigger.Setters.Add(setter);
//clear the triggers
style.Triggers.Clear();
style.Triggers.Add(trigger);
this.Style = style;*/
}
答案 0 :(得分:3)
根据您的问题,我认为您正在寻找类似的内容:
Style style = new Style();
style.TargetType = typeof(Button);
MultiDataTrigger trigger = new MultiDataTrigger();
Condition condition1 = new Condition();
condition1.Binding = new Binding() { Path = new PropertyPath("Content"), RelativeSource = RelativeSource.Self };
condition1.Value = "OK";
Condition condition2 = new Condition();
condition2.Binding = new Binding(){Path = new PropertyPath("IsMouseOver"), RelativeSource = RelativeSource.Self};
condition2.Value = true;
Setter setter = new Setter();
setter.Property = Button.ForegroundProperty;
setter.Value = Brushes.Green;
trigger.Conditions.Add(condition1);
trigger.Conditions.Add(condition2);
trigger.Setters.Add(setter);
style.Triggers.Clear();
style.Triggers.Add(trigger);
this.Style = style;
当满足两个条件时,这将导致Button的Foreground
颜色变为绿色:
1 - Button.Content
等于"OK"
2 - 鼠标位于Button
上方。
可以用以下XAML表示:
<Button Content="OK">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Content, RelativeSource={RelativeSource Self}}" Value="OK"/>
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Green"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
无需继承WPF UI元素并创建自定义按钮,只需设置视觉样式或视觉行为。
不鼓励对WPF UI元素进行子类化,因为它会降低可维护性并且完全不需要。 WPF UI模型基于Lookless控件,这意味着控件的视觉外观是完全独立的,独立于它的功能。作为一般规则,如果您要定义新功能,则只是子类化WPF UI元素,而不是更改它的外观,这可以通过WPF的内置机制(例如{{3)来完成。 }}
强烈建议您在WPF中使用正确的WPF方法,而不是winforms方法。上面的代码显示了在C#代码中以程序方式创建对象图是多么复杂和繁琐,而在XAML中它更简单,更清晰,因为没有“condition1
,condition2
”等不必要样板。
如果您的开发人员不熟悉XAML,那么Web上有大量的XAML教程,而且众所周知Styles and Templates有关于该主题的全面文档。
由于WPF MSDN的复杂性以及Visual Tree这样的概念,您会发现当前方法存在严重问题,因此很难在UI中使用UI程序式的。
强烈建议您使用UI Virtualization方法和正确的MVVM,而不是(再次)使用WPF中的传统类似winforms的方法。
同样,我无法强调,以这种方式接近WPF只会带来痛苦,折磨和失败,以及大量完全不必要,不可维护,不可扩展的代码,容易出现各种意外错误,不能轻易解决
答案 1 :(得分:0)
看起来像是一个错字:
Setter setter = new Setter();
setter.Property = Button.BackgroundProperty; // Here it was Button.IsMouseOverProperty
setter.Value = Brushes.Green;
trigger.Setters.Add(setter);
您正在尝试为IsMouseOver属性设置Brushes.Green
值,但它不起作用,因为:
IsMouseOver
readonly 属性
适用于带刷子的属性的Brushes.Green
值,例如背景和前景属性