【问题标题】:Setting background disables MouseOver effect设置背景禁用 MouseOver 效果
【发布时间】:2017-05-03 05:53:28
【问题描述】:

这是我的风格:

   <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;

设置背景时,鼠标悬停效果不起作用,但我需要设置背景。怎么了?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    直接设置的依赖属性值(“本地值”)的优先级高于样式设置器设置的值。详情请见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
    

    【讨论】:

    • 如何以这种方式以编程方式更改背景?
    • 通过以编程方式设置样式。最好不要更改触发器中的背景。
    • 我不知道如何在后面的代码中设置 basedOn:Style style = new Style { TargetType = typeof(Button) }; style.Setters.Add(new Setter(Control.ForegroundProperty, Brushes.Green)); style.basedOn = ? myControl.Style = 风格;
    【解决方案2】:

    如果您希望能够将 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;
    

    【讨论】:

      【解决方案3】:

      实际上,您可以使用优先级高于“本地值”的动画来做到这一点,方法如下:

      这样定义你的风格:

          <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 控件样式和模板。

      【讨论】:

      • 我不敢相信他们在原生控件中使用了这样的技巧。还是谢谢。
      • 其实all controls中几乎都用到了
      猜你喜欢
      • 2013-06-05
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 2015-08-24
      • 1970-01-01
      相关资源
      最近更新 更多