【问题标题】:How to disable mouse over effect visibility temporarily on button click?如何在单击按钮时暂时禁用鼠标悬停效果可见性?
【发布时间】:2014-11-03 05:38:10
【问题描述】:

为简单起见,假设我的程序按钮在“关闭”时为白色,在“开启”时为绿色。当鼠标悬停在按钮上时,按钮的颜色会变为浅蓝色。当前,当单击按钮时,按钮颜色保持浅蓝色,直到鼠标不再悬停在按钮上,然后(当鼠标移开并且不再悬停在按钮上时)按钮的绿色或白色背景为显示。悬停效果和按钮背景的代码目前...

<ControlTemplate TargetType="{x:Type Button}">
  <Border x:Name="bdr" CornerRadius="22" Margin="3" BorderThickness="2.5" BorderBrush="Black" Background="{TemplateBinding Background}">
     <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" ContentSource="Content" />
  </Border>
  <ControlTemplate.Triggers>
     <Trigger Property="IsMouseOver" Value="True">
         <Setter TargetName="bdr" Property="Background" Value="#ABBEC9"/>
     </Trigger>

我需要在单击事件后立即显示按钮的新背景(即使鼠标仍悬停在按钮上)。我在执行此操作时遇到了问题。

我尝试了下面的MultiDataTrigger,但是悬停颜色仅在单击时闪烁为白色,并且即使鼠标不再悬停在按钮上,背景颜色也不再显示,因此代码显然是错误的。

<MultiDataTrigger>
  <MultiDataTrigger.Conditions>
     <Condition Binding="{Binding ElementName=bdr, Path=IsMouseOver}" Value="True" />
  </MultiDataTrigger.Conditions>
     <Setter TargetName="bdr" Property="Background" Value="#ABBEC9" />
  </MultiDataTrigger>
<MultiDataTrigger>
   <MultiDataTrigger.Conditions>
      <Condition Binding="{Binding ElementName=bdr, Path=IsMouseOver}" Value="False" />
   </MultiDataTrigger.Conditions>
      <Setter TargetName="bdr" Property="Background" Value="White" />                            
</MultiDataTrigger>

任何帮助将不胜感激。

【问题讨论】:

  • 我会说放弃触发器并改用 VisualStateManager,更多信息 here 说明原因,或大量其他文章。干杯:)
  • 非常感谢!这正是我想要的:)

标签: c# wpf xaml mouseover buttonclick


【解决方案1】:

您必须自己处理这个问题,可能只需要最少量的程序代码(例如布尔属性)。

如果您想让事情保持简单,那么您可以用另一种方式显示状态,例如利用BorderBrush 来显示ButtonBackground

这是完整的模板:

<ControlTemplate TargetType="{x:Type Button}">
    <Border x:Name="bdr" CornerRadius="22" Margin="3" BorderThickness="2.5" BorderBrush="Black" Background="{TemplateBinding Background}">
        <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" ContentSource="Content" />
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="bdr" Property="Background" Value="#ABBEC9"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="bdr" Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource AncestorType=Button},Path=Background}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

【讨论】:

  • 我没有尝试过这个解决方案,但非常感谢你的回答:)
猜你喜欢
  • 2015-05-24
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2016-04-26
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多