我尝试在禁用时更改按钮的样式:
<Style TargetType="Button" x:Key="MyButton2">
<Setter Property="Background" Value="MediumAquamarine" />
<Setter Property="Foreground" Value="MediumBlue" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" Value="Green"/>
<Setter Property="Foreground" Value="DeepPink"/>
</Trigger>
</Style.Triggers>
</Style>
和我的按钮:
<Button Style="{StaticResource MyButton2}" Content="My text" Width="100" Height="30" IsEnabled="False" />
但由于某种原因,此样式不适用于按钮:
如何将此样式应用于我的按钮?我可以不用覆盖按钮的模板而只使用样式吗?
答案 0 :(得分:23)
我是否可以不使用样式覆盖按钮的模板?
我认为不是,因为Windows中的控件在每个版本的Windows中都有默认的Styles
和ControlTemplates
以及,它们是不同的。另外,样式 - 它只是很多设置,通常样式不会改变/添加行为来控制,这是负责ControlTemplate
的。
Note:
样式它是一组设置器,例如:设置背景,大小等。ControlTemplate
是表单,其中将显示所有这些设置。
在这种情况下,我建议大家更改ControlTemplate,无论系统版本如何,都可以在视图中使用相同的行为。
在这种情况下,请尝试此Style
:
<Window.Resources>
<Style TargetType="Button" x:Key="MyButton2">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Background" Value="MediumAquamarine" />
<Setter Property="Foreground" Value="MediumBlue" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter x:Name="MyContentPresenter"
Content="{TemplateBinding Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="Green"/>
<Setter Property="Foreground" Value="DeepPink"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<Button Content="Button"
IsEnabled="False"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="75"
Style="{StaticResource MyButton2}"
Click="Button_Click"/>
</Grid>
答案 1 :(得分:7)
奇怪的是,当我运行它时,它“工作”,部分原因,这实际上可能是按钮的模板。这是一个按钮整个模板。
<Style x:Key="FocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
<Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
<Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
<ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefaulted" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
正如您所看到的,按钮的控件模板中发生了很多事情。例如,在禁用ctl时使用以下SolidColorBrushes。
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
您可以更改这些(在您的用户控件范围内,应用程序),或者您可以将控制模板重写为Daniel Ward建议的。
您可以在UI编辑器中右键单击任何控件的默认模板,编辑模板 - &gt;创建副本......通过混合,代码或反汇编:)
希望它有所帮助!
干杯
了Stian
答案 2 :(得分:2)
似乎唯一的方法是从按钮中删除chrome主题。 请注意,如果您正在为此进行构建,这将删除悬停/点击动画以及Windows 7上按钮的渐变。
不幸的是,Microsoft决定使用disabling a button should give the background a hardcoded value from a private property in the chrome theme's code-behind,这意味着您无法通过XAML进行更改。该链接描述了问题:
Button
的控件模板使用ButtonChrome
,其中包含名为ButtonOverlay
的私有属性,当Button
IsEnabled
设置为{{{}时1}},将False
设置为Background
(或RGB 244,244,244),这是您看到的灰色。你无法改变它。
您可以做的是为按钮创建一个新的控件模板(yay),将new SolidColorBrush(Color.FromRgb(0xf4, 0xf4, 0xf4))
元素替换为Themes:ButtonChrome
元素,您可以更改Border
的{{1}}元素
它可能看起来不适用于设计视图,但在运行时可以正常工作。
因此,例如,对于你的,它可能看起来像:
Background
答案 3 :(得分:1)
我的解决方案要容易一些,但是它不允许为禁用的按钮使用Transparent
背景色,而且您也不能更改BorderBrush
。
我要做的是使用TextBlock
作为按钮的内容,并在禁用该TextBlock
背景时更改其颜色。
我的按钮是这样写的:
<Button>
<TextBlock Text="Click me!" Style="{StaticResource MyButtonContentStyle}" />
</Button>
MyButtonContentStyle是这样写的:
<Style x:Key="MyButtonContentStyle" TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
这对我们来说就像是一种魅力。
答案 4 :(得分:1)
这可能要晚了,但是WPF提供了一个内置属性:
IsHitTestVisible="False"
使用上面的控件无法检测到任何类型的鼠标移动,因此在不更改控件实际外观的情况下将其禁用。
答案 5 :(得分:1)
根据工具栏按钮样式添加。这个解决方案对我有用
BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"