【问题标题】:Change particular button Background color on Mouse over in xaml wpf在xaml wpf中更改鼠标悬停时的特定按钮背景颜色
【发布时间】:2017-06-23 11:48:11
【问题描述】:

过去三天我一直在努力解决这个问题。 我必须在鼠标悬停时更改特定的按钮背景颜色,并且应该删除按钮内容,但是如果我悬停在按钮上,我会遇到所有按钮都更改的问题。 我把我的设计放在资源字典里 下面是我的设计代码

<VisualStateManager.VisualStateGroups>
     <VisualStateGroup x:Name="CommonStates">
            <VisualState x:Name="Normal" />
            <VisualState x:Name="MouseOver">
                  <Storyboard>`<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BaseShape" Storyboard.TargetProperty="Background">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonHoverBackgroundBrush}" />
                         </ObjectAnimationUsingKeyFrames>
                         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BaseShape" Storyboard.TargetProperty="BorderBrush">
               <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonHoverBorderBrush}" />
        </ObjectAnimationUsingKeyFrames>
                      <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ButtonHighlight" Storyboard.TargetProperty="Opacity">
                                            <SplineDoubleKeyFrame KeyTime="0" Value="1" />
                     </DoubleAnimationUsingKeyFrames>
                 </Storyboard>
          </VisualState> </VisualStateGroup></VisualStateManager.VisualStateGroups>'
                             <Border x:Name="BaseShape" CornerRadius="10" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" />
                        <Rectangle x:Name="ButtonHighlight" Margin="1" RadiusX="9" RadiusY="9" Stroke="{StaticResource ButtonHoverHighlightBorderBrush}" StrokeThickness="1" Grid.ColumnSpan="2" Opacity="0" />
                        <ContentPresenter x:Name="contentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" />
                        <Rectangle x:Name="FocusedVisualElement" Stroke="{StaticResource ButtonFocusedBorderBrush}" StrokeThickness="1" RadiusX="10" RadiusY="10" Opacity="0" />
                        <Rectangle x:Name="DisabledVisualElement" Fill="{StaticResource DisabledBackgroundBrush}" IsHitTestVisible="false" RadiusX="10" RadiusY="10" Opacity="0" />

<Button Content="delete" Name="xyz" Width="70"Margin="0,65,59,4" HorizontalAlignment="Right">      
           </Button>`

和 Xaml 带有设计的文件是 我只需要修复设计方面,而不是在后面的代码中

【问题讨论】:

  • 请提供您的XAMLButton。我认为使用Trigger 会很简单。
  • 由于您的按钮没有定义样式,我猜(我只能猜测,因为您没有提供足够的信息)您的样式(您对 VisualStateManager 的定义所在的位置)配置为应用于所有按钮。类似于&lt;Style TargetType="Button"&gt;,但应该是&lt;Style Key="MagicButtonStyle" TargetType="Button"&gt;&lt;Button Style={StaticResource MagicButtonStyle"}&gt;
  • 也投票只是为了使用触发器
  • 好的,我给你整个代码请帮助我,我在网络上尝试了很多,也在 Blend 中尝试过......我使用了触发器和数据触发器,但现在工作了..请检查我下面的代码放入资源文件,如果代码中存在任何按钮,下面的样式将自动应用,我需要的是我在多个文件中有两个按钮,两个按钮都有内容,例如提交和关闭。资源文件中给出的默认按钮样式自动设置到按钮,但我想要的是。提交应该是橙色,关闭应该是红色,一旦我鼠标悬停橙色应该是橙色,但红色应该变成白色

标签: c# wpf xaml


【解决方案1】:

我假设“鼠标悬停时的按钮背景颜色和按钮内容应该被删除”你的意思是你想在鼠标悬停在按钮上时更改颜色并隐藏内容。如果是这样,你为什么不做这样的事情

    <Style TargetType="{x:Type Button}">
        <Setter Property="Background" Value="Blue"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Background="{TemplateBinding Background}" BorderBrush="Black" BorderThickness="1">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="SkyBlue"/>
                <Setter Property="Foreground" Value="SkyBlue"/>
            </Trigger>
        </Style.Triggers>
    </Style>

虽然它不会删除内容,但它会将前景和背景设置为相同的颜色,因此对用户隐藏。

针对您的 cmets 进行了编辑

您似乎在尝试使用 DataTrigger;正如answer 建议的那样,触发器非常适合对 OnMouseOver 等内容进行更改,而 DataTriggers 非常适合对数据更改进行更改。因此,除非我遗漏了什么,否则您应该使用 Trigger 而不是 DataTrigger。

解决样式变化问题的一个明显方法是创建一个包含大部分样式的默认样式,然后创建一个覆盖变化元素的第二个样式。在这种情况下,您的第二种样式会给它“在鼠标悬停时隐藏我的文本”行为。

你的默认样式可能是这样的

<Style x:Key="ButtonDefaultStyle" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Blue"/>
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{TemplateBinding Background}" BorderBrush="Black" BorderThickness="1">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="White"/>
            <Setter Property="Foreground" Value="Blue"/>
        </Trigger>
    </Style.Triggers>
</Style>

你的第二种风格可能是这样的

<Style x:Key="ButtonHideTextOnMouseOverStyle" BasedOn="{StaticResource ButtonDefaultStyle}" TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </Style.Triggers>
</Style>

然后你会像这样使用它们

<Button Content="First Button" Style="{StaticResource ButtonDefaultStyle}"/>
<Button Content="Second Button" Style="{StaticResource ButtonDefaultStyle}"/>
<Button Content="Delete" Style="{StaticResource ButtonHideTextOnMouseOverStyle}"/>

在 ButtonDefaultStyle 情况下,蓝色背景上的白色文本会在鼠标悬停时更改为白色背景上的蓝色文本。在 ButtonHideTextOnMouseOverStyle 情况下,蓝色背景上的白色文本在鼠标悬停时更改为白色背景上的白色文本。

完整的例子在这里

<Window x:Class="Button_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Button_Test"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="ButtonDefaultStyle" TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Blue"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border Background="{TemplateBinding Background}" BorderBrush="Black" BorderThickness="1">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="White"/>
                    <Setter Property="Foreground" Value="Blue"/>
                </Trigger>
            </Style.Triggers>
        </Style>
        <Style x:Key="ButtonHideTextOnMouseOverStyle" BasedOn="{StaticResource ButtonDefaultStyle}" TargetType="{x:Type Button}">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Foreground" Value="White"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="Buttons"/>
        <Button Content="First Button" Style="{StaticResource ButtonDefaultStyle}"/>
        <Button Content="Second Button" Style="{StaticResource ButtonDefaultStyle}"/>
        <Button Content="Delete" Style="{StaticResource ButtonHideTextOnMouseOverStyle}"/>
    </StackPanel>
</Window>

【讨论】:

  • 见下面代码
  • 我的输出是所有三个按钮相同的背景白色和边框刷红色..我只希望删除按钮应该是白色的..不是全部
  • 我不想隐藏任何我只想“更改我唯一的删除按钮在鼠标悬停时多个按钮的样式相同
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2017-07-28
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多