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"的有效值。

我做错了什么?

WPF按钮样式模板已启用

这与您的静态引用有关。

特别是,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]"/>

为了摆脱为字体创建单独笔刷对象的需要。