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中的listview中的Columnheader和Data行之间删除分隔符边框行