wpf 如何样式按钮的悬停和单击前景?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17090169/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 08:59:57  来源:igfitidea点击:

How To Style Button's Hover And Click Foreground?

c#wpfbuttonstyleshover

提问by MCSharp

I am new to Stylesand not sure on the best way to create a Buttonstyle to change the Foregroundof IsMouseOverand IsPressed. I used a Borderfor a template because it has a CornerRadiusand background and border properties. But Borderdoes not have a Foregroundproperty. Using Buttonas the template doesn't work well since the default look isn't being overridden.

我是新来的Styles,并不能确定上建立一个最好的办法Button风格改变ForegroundIsMouseOverIsPressed。我使用 aBorder作为模板,因为它具有 aCornerRadius和背景和边框属性。但是Border没有Foreground属性。使用Button以来的默认外观不被覆盖的模板不很好地工作。

What is a better way to style a Buttontemplate with Foregroundbehavior? Maybe using a label inside the border?

ButtonForeground行为设计模板的更好方法是什么?也许在边界内使用标签?

Here is the App.xaml:

这是 App.xaml:

<Application.Resources>
    <Style TargetType="Button" x:Key="MyButton">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="MinHeight" Value="34"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="shortcutbutton"  
                    BorderThickness="1"
                    BorderBrush="Black"
                    Background="Gray">
                        <ContentPresenter Margin="2" 
                                  HorizontalAlignment="Center"
                                  VerticalAlignment="Center" 
                                  RecognizesAccessKey="True"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="shortcutbutton" Property="Background" Value="#FFDADADA" />
                            <Setter TargetName="shortcutbutton" Property="BorderBrush" Value="#EEEEEE" />
                            <!--<Setter TargetName="Border" Property="Foreground" Value="Black" />-->
                        </Trigger>
                        <Trigger Property="IsPressed" Value="true">
                            <Setter TargetName="shortcutbutton" Property="Background" Value="DarkGray" />
                            <Setter TargetName="shortcutbutton" Property="BorderBrush" Value="Black" />
                            <!--<Setter TargetName="Border" Property="Foreground" Value="Red" />-->
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Application.Resources>

And the xaml:

和xaml:

    <StackPanel HorizontalAlignment="Center" Height="100" VerticalAlignment="Center" Width="100">
        <Button Content="Button" Height="41" Style="{DynamicResource MyButton}"/>
    </StackPanel>

采纳答案by dkozl

What you can do is set attached property of TextElementon the Borderand like that every text element within your Borderwill be of that colour:

您可以做的是设置TextElementon the 的附加属性,Border并且您的每个文本元素Border都将具有该颜色:

<ControlTemplate.Triggers>
   <Trigger Property="IsMouseOver" Value="true">
       <Setter TargetName="shortcutbutton" Property="Background" Value="#FFDADADA" />
       <Setter TargetName="shortcutbutton" Property="BorderBrush" Value="#EEEEEE" />
       <Setter TargetName="shortcutbutton" Property="TextElement.Foreground" Value="White"/>
   </Trigger>
   ...
</ControlTemplate.Triggers>

回答by Richard E

You need to move your Triggers from the ControlTemplate to the Style. Something like this:

您需要将触发器从 ControlTemplate 移动到 Style。像这样的东西:

        <Style TargetType="Button">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="MinHeight" Value="34"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="shortcutbutton"  
                BorderThickness="1"
                BorderBrush="Black"
                Background="Gray">
                        <ContentPresenter Margin="2" 
                              HorizontalAlignment="Center"
                              VerticalAlignment="Center" 
                              RecognizesAccessKey="True"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="Foreground" Value="#FFDADADA" />
            </Trigger>
            <Trigger Property="IsPressed" Value="true">
                <Setter Property="Foreground" Value="DarkGray" />
            </Trigger>
        </Style.Triggers>
    </Style>