设置背景将禁用MouseOver效果

时间:2016-12-17 17:35:02

标签: c# wpf

这是我的风格:

   <UserControl.Resources>
    <Style TargetType="Button" x:Key="Style2" BasedOn="{StaticResource MetroCircleButtonStyle}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="#000000"/>
                <Setter Property="Background" Value="#ededed"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Foreground" Value="#ffffff"/>
                <Setter Property="Background" Value="#009688"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="#FF808080"/>
            </Trigger>

        </Style.Triggers>
    </Style>
</UserControl.Resources>

我这样使用它:

<Button x:Name="button" Content="abcdefg" Style="{DynamicResource Style2}" Width="45" Height="45" VerticalAlignment="Top" BorderThickness="0"  FontSize="18"  FontFamily="/WpfApplication2;component/Resources/#Vazir"/>

这完全可以。问题是当我尝试通过更改XAML或动态更改背景来更改按钮的背景时。当我这样做时,鼠标悬停效果不再起作用。

<Button x:Name="button" Content="abcdefg" Background="White" Style="{DynamicResource Style2}" Width="45" Height="45" VerticalAlignment="Top" BorderThickness="0"  FontSize="18"  FontFamily="/WpfApplication2;component/Resources/#Vazir"/>

或者

button.Background = Brushes.Transparent;

设置背景时MouseOver效果不起作用,但我需要设置背景。有什么问题?

3 个答案:

答案 0 :(得分:2)

直接设置的依赖项属性值(“本地值”)的优先级高于样式设置器设置的值。有关详细信息,请参阅Dependency Property Value Precedence

所以,设置

<Button Background="White" ... />

有效地禁用了触发器。

您应该通过另一个样式设置器设置Background属性,例如

<Button ...>
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource Style2}">
            <Setter Property="Foreground" Value="White"/>
        </Style>
    </Button.Style>
</Button

答案 1 :(得分:1)

如果您希望能够将Background属性设置为本地值,并且当鼠标移过Button时仍然可以更改它,则可以在Button的ControlTemplate中定义触发器。这实际上意味着您必须复制MetroCircleButtonStyle基本样式或直接将数据触发器添加到基本样式。

或者,您可以按照Clemens的建议在Style中设置Foreground属性。您可以通过编程方式创建样式:

Style style = new Style { TargetType = typeof(Button) };
style.Setters.Add(new Setter(Control.ForegroundProperty, Brushes.Green));
style.BasedOn = FindResource("MetroCircleButtonStyle") as Style;
button1.Style = style;

答案 2 :(得分:1)

实际上,您可以使用优先级高于“本地值”的动画来实现,具体方法如下:

像这样定义你的风格:

    <Style TargetType="Button" x:Key="ButtonStyle">
        <Style.Triggers>
            <EventTrigger RoutedEvent="Button.MouseEnter">
                <BeginStoryboard>
                    <Storyboard TargetProperty="(Foreground).(SolidColorBrush.Color)">
                        <ColorAnimation To="Red" Duration="0:0:0"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

然后你可以使用你的按钮

        <Button Content="Button Title 1" Foreground="Green" Style="{StaticResource ButtonStyle}"/>
        <Button Content="Button Title 2" Foreground="Blue" Style="{StaticResource ButtonStyle}"/>

此“技巧”用于标准WPF控件样式和模板。