通过行为更改属性禁用XAML样式中的触发器

时间:2017-03-14 07:20:21

标签: c# wpf xaml behavior

您可以在下面查看我的Behavior和XAML样式的一部分。因此,如果没有附加行为,一切都很好。但是附加了Behavior Trigger不再被解雇了,我的背景上只有这个新颜色。有人可以给我一个提示,如何更改颜色而不覆盖Trigger

行为代码段

public class ChangeColor : Behavior<FrameworkElement>
{
    public string NewColor
    {
        get { return (string)GetValue(NewColorProperty); }
        set { SetValue(NewColorProperty, value); }
    }

    public static DependencyProperty NewColorProperty = DependencyProperty.Register("NewColor", typeof(string), typeof(ChangeColor), new PropertyMetadata(""));

    protected override void OnAttached()
    {
        if (!DesignerProperties.GetIsInDesignMode(this))
        {
            AssociatedObject.Loaded += AssociatedObject_Loaded;
        }
    }
    public Brush DefaultColor
    {
        get { return (Brush)GetValue(DefaultColorProperty); }
        set { SetValue(DefaultColorProperty, value); }
    }

    public static DependencyProperty DefaultColorProperty = DependencyProperty.Register("DefaultColor", typeof(Brush), typeof(ChangeColor), null);

    private PropertyInfo _TargetProperty;

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
    {
        _TargetProperty = AssociatedObject.GetType().GetProperty("Background");

        if (DefaultColor == null)
        {
            try
            {
                DefaultColor = (Brush)_TargetProperty.GetGetMethod().Invoke(AssociatedObject, null);
            }
            catch
            {
                //ignore
            }
        }
    }

    private void ChangeTheColor()
    {
        if ((bool)change)
        {
            _TargetProperty.GetSetMethod().Invoke(AssociatedObject, new object[] { NewColor });
        }
        else
        {
            _TargetProperty.GetSetMethod().Invoke(AssociatedObject, new object[] { DefaultColor });
        }
    }
}

XAML代码段

<Style TargetType="Controls:CustomButton">
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsReadOnly" Value="False"/>
                <Condition Property="IsMouseOver" Value="True"/>
            </MultiTrigger.Conditions>
            <MultiTrigger.Setters>
                <Setter Property="Background" Value="{Extensions:ThemeColors KeyCode=BackgroundSpecialColor}"/>
            </MultiTrigger.Setters>
        </MultiTrigger>
    </Style.Triggers>
</Style>

1 个答案:

答案 0 :(得分:0)

尝试像这样制作DependencyProperty。

env

其中 public Brush NewColor { get { return (Brush)GetValue(NewColorProperty); } set { SetValue(NewColorProperty , value); } } public static readonly DependencyProperty NewColorProperty = DependencyProperty.Register("NewColor" , typeof(Brush) , typeof(ChangeColor) , new FrameworkPropertyMetadata(new SolidColorBrush(Colors.Black) , FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 是默认颜色,这将其设置为默认绑定TwoWay SolidColorBrush(Colors.Black),也许这是一个问题,因为如果你没有设置它默认绑定TwoWay然后你必须在绑定Mode = TwoWay中进行,否则你的属性不会注册该更改。希望对你有所帮助。

编辑:我可以看到您使用Button作为基类并想要在触发器上更改按钮背景?我真的不能说最好的方法是什么,但我会在FrameworkPropertyMetadataOptions.BindsTwoWayByDefault),a和generic.xaml中这样做我会这样做:

<ControlTemplate.Triggers>

在你的风格开始时,你有类似的东西:

<ControlTemplate.Triggers>
      <Trigger Property="IsPressed"
               Value="true">
         <Setter Property="Background"                                   
                 Value="{Binding NewColor, RelativeSource={RelativeSource TemplatedParent}}" />

        </Trigger>

</ControlTemplate.Triggers>

只需将该行代码更改为:

<Setter Property="Background"
                Value="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />

这样你就可以在开始时设置默认颜色,在触发器上设置NewColor。

并在某些xaml代码中调用该自定义按钮

<Setter Property="Background"
                    Value="{Binding DefaultColor, RelativeSource={RelativeSource TemplatedParent}}" />