WPF Button isPressed 和 isEnabled 问题

Posted

技术标签:

【中文标题】WPF Button isPressed 和 isEnabled 问题【英文标题】:WPF Button isPressed and isEnabled problem 【发布时间】:2011-03-31 21:29:12 【问题描述】:

更新:使用 Expression Blend 3

我正在尝试为 WPF 应用程序中的一类按钮设置 IsPressed 和 IsEnabled(false) 属性触发器的样式。

这是一个使用样式的带有按钮的 UserControl...

<UserControl
    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"
    mc:Ignorable="d"
    x:Class="Kiosk.ButtonTest"
    x:Name="UserControl">

    <Grid x:Name="LayoutRoot">
        <Button HorizontalAlignment="Left" Style="DynamicResource BlueButton" VerticalAlignment="Top" Width="155" Content="Button" Height="52.9"/>
    </Grid>
</UserControl>

这是样式片段...

   <!-- Blue Button -->
   <Style x:Key="BlueButton" TargetType="x:Type Button">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="DynamicResource BlueGradient3"/>
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" Value="DynamicResource DarkGradient1"/>
            <Setter Property="BorderBrush" Value="DynamicResource BlueGradient3"/>
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="Background" Value="DynamicResource DarkGradient1"/>
            <Setter Property="BorderBrush" Value="DynamicResource BlueGradient1"/>
        </Trigger>
    </Style.Triggers>
    <Setter Property="FocusVisualStyle" Value="StaticResource ButtonFocusVisual"/>
    <Setter Property="Background" Value="DynamicResource BlueGradient1"/>
    <Setter Property="BorderBrush" Value="DynamicResource BlueGradient2"/>
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="TextBox.TextAlignment" Value="Center"/>       
    <Setter Property="FontFamily" Value="Trebuchet MS"/>
    <Setter Property="FontSize" Value="18"/>
    <Setter Property="Effect" Value="DynamicResource KioskStandardDropShadow" />
</Style>
<LinearGradientBrush x:Key="BlueGradient1" EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="#FF3FA2FD" Offset="0"/>
    <GradientStop Color="#FF014782" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="BlueGradient2" EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="#FF014782" Offset="0"/>
    <GradientStop Color="#FF3FA2FD" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="BlueGradient3" EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="#FF014782" Offset="1"/>
    <GradientStop Color="#FF0B2135" Offset="0"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="DarkGradient1" EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="#FF2A2A2A" Offset="0"/>
    <GradientStop Color="#FF474747" Offset="0.478"/>
    <GradientStop Color="#FF323232" Offset="0.487"/>
    <GradientStop Color="Black" Offset="1"/>
    <GradientStop Color="#FF282828" Offset="0.681"/>
</LinearGradientBrush>
    <!-- Regular Drop Shadow --> 
    <DropShadowEffect x:Key="KioskStandardDropShadow" Opacity="0.6" BlurRadius="10" ShadowDepth="5" Direction="308"/>
<!-- fragment end -->

Default 和 Mouse over 更改工作正常,但 isEnabled false 和 isPressed true 仍然显示 Button 默认颜色。

我做错了什么?

【问题讨论】:

我试过你的代码,它对我有用:默认-浅蓝色,鼠标悬停-深蓝色,IsPressed-灰色,禁用-灰色。但是,我确实删除了 FocusVisualStyle 的设置器,因为您没有包含它。 这不是答案,我知道,但试试 Visual State Manager。 您可以编辑您的问题以添加额外的代码,而不是将其作为评论发布。 【参考方案1】:

我在研究http://mark-dot-net.blogspot.com/2007/07/creating-custom-wpf-button-template-in.html的代码后修复了它...

这是我最终得到的,效果很好。

<!-- Blue Button -->
<Style x:Key="BlueButton" TargetType="x:Type Button">
<Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Name="border" 
                    BorderThickness="2"
                    Padding="4,2" 
                    BorderBrush="DynamicResource BlueGradient2"
                    CornerRadius="5" 
                    Background="TemplateBinding Background">
                    <Grid >
                    <ContentPresenter 
                                HorizontalAlignment="Center" 
                                VerticalAlignment="Center" 
                                Name="content"/>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="DynamicResource BlueGradient3"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Background" Value="DynamicResource DarkGradient1"/>
                        <Setter Property="BorderBrush" Value="DynamicResource BlueGradient3"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Background" Value="DynamicResource DarkGradient1"/>
                        <Setter Property="BorderBrush" Value="DynamicResource BlueGradient1"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="FocusVisualStyle" Value="StaticResource ButtonFocusVisual"/>
    <Setter Property="Background" Value="DynamicResource BlueGradient1"/>
    <Setter Property="BorderBrush" Value="DynamicResource BlueGradient2"/>
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="TextBox.TextAlignment" Value="Center"/>       
    <Setter Property="FontFamily" Value="Trebuchet MS"/>
    <Setter Property="FontSize" Value="15pt"/>
    <Setter Property="Effect" Value="DynamicResource KioskStandardDropShadow" />
</Style>

【讨论】:

【参考方案2】:

您需要替换 ControlTemplate 来更改按钮的背景颜色。

这是我从 MSDN 复制的一个,它适用于您的代码。 您可以将您的特定覆盖合并到此样式。

编辑: 要使以下样式正常工作,您需要从 Microsoft 下载 Styling with Control Templates Sample。如果您从示例中包含 Button.xaml 和 Shared.xaml,则以下样式应该有效,因为这两个文件包含下面列出的 XAML 中的所有静态资源。我正在 Visual Studio 2008 中进行测试。

这是我更改用户控件的方式:

<UserControl x:Class="ButtonPressed.Views.KioskButton"
  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" 
  mc:Ignorable="d" 
  Height="300" Width="300">

  <UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary 
              Source="Button.xaml">
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </UserControl.Resources>

  <Grid>
    <Button HorizontalAlignment="Left" VerticalAlignment="Top" Width="155" Content="Button" Height="52.9"/>
  </Grid>
</UserControl>

这是来自 Button.xaml 的按钮样式的一部分:

<Style TargetType="Button">
  <Setter Property="SnapsToDevicePixels" Value="true"/>
  <Setter Property="OverridesDefaultStyle" Value="true"/>
  <Setter Property="FocusVisualStyle" Value="StaticResource ButtonFocusVisual"/>
  <Setter Property="MinHeight" Value="23"/>
  <Setter Property="MinWidth" Value="75"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Border 
          x:Name="Border"  
          CornerRadius="2" 
          BorderThickness="1"
          Background="StaticResource NormalBrush"
          BorderBrush="StaticResource NormalBorderBrush">
          <ContentPresenter 
            Margin="2"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            RecognizesAccessKey="True"/>
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsKeyboardFocused" Value="true">
            <Setter TargetName="Border" Property="BorderBrush" Value="StaticResource DefaultedBorderBrush" />
          </Trigger>
          <Trigger Property="IsDefaulted" Value="true">
            <Setter TargetName="Border" Property="BorderBrush" Value="StaticResource DefaultedBorderBrush" />
          </Trigger>
          <Trigger Property="IsMouseOver" Value="true">
            <Setter TargetName="Border" Property="Background" Value="StaticResource DarkBrush" />
          </Trigger>
          <Trigger Property="IsPressed" Value="true">
            <Setter TargetName="Border" Property="Background" Value="StaticResource PressedBrush" />
            <Setter TargetName="Border" Property="BorderBrush" Value="StaticResource PressedBorderBrush" />
          </Trigger>
          <Trigger Property="IsEnabled" Value="false">
            <Setter TargetName="Border" Property="Background" Value="StaticResource DisabledBackgroundBrush" />
            <Setter TargetName="Border" Property="BorderBrush" Value="StaticResource DisabledBorderBrush" />
            <Setter Property="Foreground" Value="StaticResource DisabledForegroundBrush"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

【讨论】:

将此作为样式(使用 x:Key="CustomButton" 引用它)添加到 Expression Blend,只会给出“无效 XAML”错误。 我添加了在哪里可以找到静态资源的引用。 不幸的是,使用 ControlTemplates Sample 进行样式设置不适用于 Expression Blend 3。但没关系,我添加了一个适用于它的答案。 在 Blend 3 中工作正常。我确实需要将 Button.xaml 作为资源打开,但来自 Blend 的消息很明显。

以上是关于WPF Button isPressed 和 isEnabled 问题的主要内容,如果未能解决你的问题,请参考以下文章

WPF 自定义一个Button控件,通过设置3个张图片,实现:平常状态、鼠标移入、鼠标按下时分别显示3张图片

WPF 按钮属性触发器的问题

如何样式按钮悬停并单击前景?

如何在WPF中的listview中的Columnheader和Data行之间删除分隔符边框行

wpf listview问题。给listview的每一行都加个button,button绑定该行。

WPF中给Button加上图标和文字