【问题标题】:How can I remove hover effect on a Button in WPF [duplicate]如何删除WPF中按钮的悬停效果[重复]
【发布时间】:2020-01-17 22:42:30
【问题描述】:

我在 Visual Studio WPF 中有一个按钮,当我将鼠标悬停在它上面时,您可以看到它变亮了。

https://i.stack.imgur.com/l9kJh.png

我怎样才能删除它?我尝试查找解决方案,但我是初学者,所以我不明白如何实施给定的解决方案。

【问题讨论】:

    标签: c# wpf visual-studio


    【解决方案1】:

    需要进行设置,以便“IsMouseOver”触发器的背景颜色与默认颜色相同。

    与此解决方案相同,只是保持颜色相同 Change color of Button when Mouse is over

        <Button Width="50" Height="50" Content="Hi" Click="ButtonBase_OnClick" >
            <Button.Style>
                <Style TargetType="Button">
                    <Setter Property="Background" Value="LightGray"/>
                    <Setter Property="Template">
    
                        <Setter.Value>
    
                            <ControlTemplate TargetType="{x:Type Button}">
                                <Border Background="{TemplateBinding Background}">
                                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="LightGray"></Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    

    【讨论】:

    • 关键是只实现所需的触发器并保留那些不是的触发器。尽可能使用TemplateBinding 来维护样式等功能。例如,内容对齐属性应该反映模板化父级的设置。 ContentPresenter.HorizontalAlignment 应该绑定到模板化父级的 Button.HorizontalContentAlignment 属性。检查我的答案。
    【解决方案2】:

    您必须覆盖ControlTemplate。当您覆盖它时,您必须重新实现由用户交互触发的行为(视觉状态),例如按下、鼠标悬停、禁用。

    只实施您需要的触发器,留下您想避免的触发器。在您的情况下,不要实现鼠标悬停视觉状态触发器:

    App.xaml

    <ControlTemplate x:Key="NoMouseOverButtonTemplate" 
                     TargetType="Button">
      <Border Background="{TemplateBinding Background}"
              BorderBrush="{TemplateBinding BorderBrush}"
              BorderThickness="{TemplateBinding BorderThickness}">
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
      </Border>
    
      <!-- Add only required visual state triggers -->
      <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled"
                 Value="False">
          <Setter Property="Background"
                  Value="{x:Static SystemColors.ControlLightBrush}" />
          <Setter Property="Foreground"
                  Value="{x:Static SystemColors.GrayTextBrush}" />
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
    

    用法

    <Button Template="{StaticResource NoMouseOverButtonTemplate}" />
    

    要了解ControlTemplate 中包含的必需元素,这些元素对于模板化控件按预期执行是必需的,请检查Microsoft Docs: Control Styles and Templates 页面(在您的情况下为Button Styles and Templates 页面)并检查命名部分,因为某些控件需要某些元素带有特定名称以便被识别。
    您还可以使用那里提供的默认模板作为设计或自定义控件的起点。

    【讨论】:

    • 这段代码是进入 Grid 下的 XAML 还是 App.xaml 中?
    • 由于某种原因,它说“错误 XDG0012 成员“isEnabled”无法识别或无法访问。蓝宝石 MainWindow.xaml 22"
    • 属性名称区分大小写。它们遵循通用的 C# 约定,因此属性(通常是公共成员)以大写字母开头。它的 IsEnabled.
    • 如果您想使其可重用或全局提取 ControlTemplate 并将其移动到例如 App.xaml 中。我将更新示例以显示它。
    • 也许我做错了什么,但这种方法似乎会干扰未启用的按钮;灰显的效果似乎消失了。
    猜你喜欢
    • 2013-01-17
    • 2011-04-20
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2013-07-11
    相关资源
    最近更新 更多