使用UserControl继承样式

本文关键字:样式 继承 UserControl 使用 | 更新日期: 2023-09-27 18:10:26

我正在尝试自定义用户控件的样式,继承其样式并添加一些额外的样式给它。我做了一个小项目来尝试。假设我有一个名为UserControl1的用户控件(它包含的内容无关紧要-在我的示例项目中它是空的)。

我在我的MainWindow中使用它如下:

<Window x:Class="WpfStyleInheritance.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfStyleInheritance"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:UserControl1>
            <local:UserControl1.Style>
                <Style TargetType="{x:Type local:UserControl1}" BasedOn="{x:Type local:UserControl1}">
                    <Setter Property="Margin" Value="0" />
                </Style>
            </local:UserControl1.Style>
        </local:UserControl1>
    </Grid>
</Window>

BasedOn部分,我得到错误:

指定的值无法赋值。以下类型是预期的:"Style".

如果我将其更改为BasedOn="{StaticResource {x:Type local:UserControl1}}",那么我得到错误:

资源"{x:Type local:UserControl1}"无法解析。

我怎样才能让它工作,从此过上幸福的生活?

编辑:正如我在这里的回答的评论中发布的,如果我去StaticResource路由并运行,我得到一个带有消息的XamlParseException:

找不到名为'WpfStyleInheritance.UserControl1'的资源。资源名区分大小写。

附加信息:如果我用Button替换主窗口标记中local:UserControl1的所有实例,它工作得很好。问题在于用户控件。

编辑2:如果我在UserControl中添加一个样式,问题仍然存在:

<UserControl.Style>
    <Style TargetType="UserControl">
        <Setter Property="Height" Value="0" />
    </Style>
</UserControl.Style>

使用UserControl继承样式

BasedOn 语法错误。应该是:

BasedOn="{StaticResource {x:Type local:UserControl1}}"

即使你得到设计错误,尝试重新编译你的代码。确保添加的命名空间正确映射到UserControl.

同时,确保MainWindowUserControl1位于同一个程序集中。

如果它们位于不同的程序集中,则必须在命名空间声明中指定程序集名称:

xmlns:local="clr-namespace:WpfStyleInheritance;assembly=AssemblyName"

如果你没有为 UserControl1 定义任何默认样式,你不需要使用 BasedOn ,因为你的UserControl没有默认样式存在。这就是为什么你会得到一个异常。

删除BasedOn,它将正常工作。


你在XAML中定义的资源不是默认样式,而是UserControl的本地样式,如果你在主窗口中定义另一个本地资源,它将被覆盖。

如果你想要UserControl1的默认样式,在 Application resources 下声明,即在 App.xaml 中声明。

<Application.Resources>
   <Style TargetType="{x:Type local:UserControl1}">
      <Setter Property="Height" Value="0" />
   </Style>
</Application.Resources>

,现在在主窗口。Xaml,这将工作得很好:

<local:UserControl1>
    <local:UserControl1.Style>
        <Style TargetType="{x:Type local:UserControl1}"
               BasedOn="{StaticResource {x:Type local:UserControl1}}">
            <Setter Property="Margin" Value="0" />
        </Style>
    </local:UserControl1.Style>
</local:UserControl1>