WPF按钮样式模板已启用
本文关键字:启用 按钮 样式 WPF | 更新日期: 2023-09-27 18:21:28
我的应用程序基于此示例
我需要我自己的按钮样式(没有鼠标悬停动画等),所以我在app.xaml:中做了这个
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Border"
CornerRadius="2" BorderThickness="1"
Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
<ContentPresenter Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True"/>
</Border>
<ControlTemplate.Triggers>
<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>
我的按钮:<Button IsEnabled="true"/>
现在,如果我将按钮更改为<Button IsEnabled="false"/>
,我的应用程序一开始就会崩溃,并出现错误:"{DependencyProperty.UnsetValue}"不是属性"BorderBrush"的有效值。
我做错了什么?
这与您的静态引用有关。
特别是,XAML解析在顺序上非常敏感-您必须确保在解析器到达上述样式的行之前引用了带有x:Key="DisabledForegroundBrush"
的笔刷-即使您的上述样式与DisabledForegroundBrush
在同一文件中也是如此。
如果你还没有DisabledForegroundBrush
的画笔,如果你不需要,你可以删除上面代码中引用它的行,或者,如果你想要,你可以创建一个如下:
<SolidColorBrush x:Key="DisabledForegroundBrush" Color="Red" />
您可以根据需要选择颜色。或者,您也可以在此处选择其他类型的画笔:http://msdn.microsoft.com/en-us/library/aa970904(v=vs.110).aspx
如果你已经有了一个想要使用的画笔,那么如果你能提供更多关于画笔在代码库中的位置(例如,它在资源字典中吗?)以及DisabledForegroundBrush
画笔在哪里的信息,这可能会帮助我确定一个实际的解决方案/确保画笔被引用的最佳方式。
注意:如果不能确保首先解析DisabledForegroundBrush
,另一种选择是将StaticResource
更改为DynamicResource
,但除非资源的链接在运行时实际发生更改,否则不建议这样做(请参阅WPF中的StaticResource和DynamicResource之间有什么区别?)
更简单的解决方案:
如果你只是想在中硬编码样式,而不是从外部引用前景笔刷,那么你可以更改行:
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
至:
<Setter Property="Foreground" Value="[SOME COLOR]"/>
为了摆脱为字体创建单独笔刷对象的需要。