如何在c#代码的Button中添加IsMouseOver触发器?

时间:2014-04-22 17:40:39

标签: .net wpf triggers

我有一个从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;*/
    }

2 个答案:

答案 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中它更简单,更清晰,因为没有“condition1condition2”等不必要样板。

如果您的开发人员不熟悉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值,例如背景和前景属性