通过函数设置背景会中断ControlTemplate触发器

时间:2017-12-05 21:46:49

标签: c# wpf xaml triggers

C#:

private void SW_btnMouseOverHighlight(object sender, System.Windows.Input.MouseEventArgs e)
        {
            Type type = sender.GetType();
            PropertyInfo bgColor = type.GetProperty("Background");
            if (bgColor != null)
            {
                String color = bgColor.GetValue(sender).ToString();
                Color col = (Color)ColorConverter.ConvertFromString(color);
                col.R += ShipWeaponUIConstants.mouseOverHighlightIntensity;
                col.G += ShipWeaponUIConstants.mouseOverHighlightIntensity;
                col.B += ShipWeaponUIConstants.mouseOverHighlightIntensity;
                var brush = new SolidColorBrush(col);
                //bgColor.SetValue(sender, brush);
            }
        }

XAML:

<Style x:Key="CustomToggleButton" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource ToggleButtonColor}">
    <EventSetter Event="MouseEnter" Handler="SW_btnMouseOverHighlight"/>
    <EventSetter Event="MouseLeave" Handler="SW_btnMouseOverHighlightRemove"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <ControlTemplate.Triggers>
                    <Trigger  Property="IsChecked" Value="True">
                        <Setter Property="Background" Value="#FF45B62C"/>
                        <Setter Property="Foreground" Value="#FF222222"/>
                        <Setter TargetName="borderLight" Property="BorderBrush" Value="#FF333333"/>
                        <Setter TargetName="borderDark" Property="BorderBrush" Value="#FF777777"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

所以我有一个切换按钮。检查时,背景会改变颜色。 (通过xaml中的触发器) 我还有一个C#函数,它采用按钮的颜色并使其变亮以显示鼠标在它上面。

这两个功能都可以自行运行,但是当我启用它们时,C#函数中的颜色变换将通过xaml触发器覆盖任何后续颜色变化。

我知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这当然是因为本地值(由属性设置器中的init/signIn设置)比样式设置器中的值高value precedence

请尝试使用SetValue。您还应该通过DependencyObject.SetCurrentValue获取属性值,而不是反射。

DependencyObject.GetValue