当前位置 : 主页 > 手机开发 > 其它 >

继承自应用程序样式(WPF)

来源:互联网 收集:自由互联 发布时间:2021-06-19
我试图在我的 WPF应用程序中继承某个Window的应用程序级样式,但是我很难让它继承而不是简单地覆盖现有的样式. 在App.xaml中(在App.Resources元素下)我定义了一个样式: Style TargetType="Butto
我试图在我的 WPF应用程序中继承某个Window的应用程序级样式,但是我很难让它继承而不是简单地覆盖现有的样式.

在App.xaml中(在App.Resources元素下)我定义了一个样式:

<Style TargetType="Button">
    <Setter Property="Padding" Value="6"/>
    <Setter Property="FontWeight" Value="Bold"/>
</Style>

在XAML论坛中,我在Window.Resources下定义了以下内容:

<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="Padding" Value="6"/>
    <Setter Property="FontWeight" Value="Bold"/>
</Style>

这里的问题是前一个(app)样式被忽略,好像后一个(窗口)样式已经覆盖它.设置了BasedOn属性,用于表示应该继承现有样式,据我所知.删除属性也无济于事.我能想到的唯一潜在原因是{StaticResource {x:Type Button}}仅引用默认的WPF样式,而不是我在App.xaml中定义的样式.

我知道使用x:Key属性可以实现这种样式行为,但我希望有一种更优雅的方式,允许我将具有继承的样式应用于范围内的所有控件(即应用程序/窗口).

更新

感谢您的回复.你确实在样本应用程序中按预期工作是对的.不同之处在于我无意中没有提到App.xaml中的样式包含在ResourceDictionary中,因此:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>

            <ResourceDictionary Source="SettingsDictionary.xaml"/>

            <ResourceDictionary>

                <Style x:Key="DefaultButton" TargetType="Button">
                    <Setter Property="Padding" Value="4"/>
                    <Setter Property="HorizontalAlignment" Value="Center"/>
                    <Setter Property="VerticalAlignment" Value="Center"/>
                </Style>

            </ResourceDictionary>

        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

关于在这种情况下如何纠正问题的任何建议?

编辑

经过一些研究,我发现如果设置了TargetType,则会自动生成x:Key.所以,App.xaml中的样式是正确的.但是,wpf设计器缺乏一些资源处理技能,并且不显示这两种样式.如果您构建并运行项目,则将应用这两种样式.

如果您的机器和VS2008的行为与我测试您的代码的行为相似.

希望这可以帮助.

编辑2

App.xaml中的资源和合并词典一直很古怪.
我通过将第一个样式声明从合并字典中移出来解决了这个问题,如下所示:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>

            <!--<ResourceDictionary Source="SettingsDictionary.xaml"/>-->

        </ResourceDictionary.MergedDictionaries>

        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="Padding" Value="4"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
        </Style>

    </ResourceDictionary>
</Application.Resources>

另请注意,为样式提供除{x:Type Button}以外的显式设置键将使其成为非默认样式,并使其不会自动应用.

通常建议仅为来自另一个文件的资源指定合并的字典,并在默认空间中指定编码资源,如上所述.

网友评论