使用UserControl进行样式继承

时间:2014-06-27 10:24:33

标签: c# wpf user-controls

我正在尝试自定义用户控件的样式,继承其样式并为其添加一些额外的样式。我做了一个小项目试试这个。我们假设我有一个名为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部分,我收到错误:

  

无法分配指定的值。预计会出现以下类型:&#34;样式&#34;。

如果我将其更改为BasedOn="{StaticResource {x:Type local:UserControl1}}",则会收到错误消息:

  

资源&#34; {x:输入local:UserControl1}&#34;无法解决。

我怎样才能让这种工作永远幸福地生活?

编辑:正如我在答案的评论中发布的那样,如果我去StaticResource路线并运行,我会收到一条带有消息的XamlParseException:

  

找不到名为&#39; WpfStyleInheritance.UserControl1&#39;的资源。资源名称区分大小写。

其他信息:如果我用local:UserControl1替换MainWindow标记中的Button的所有实例,它的效果非常好。问题在于用户控制。

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

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

1 个答案:

答案 0 :(得分:2)

BasedOn 语法不正确。它应该是:

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

即使您遇到设计器错误,也请尝试重新编译代码。确保添加的命名空间正确映射到UserControl。

此外,请确保 MainWindow UserControl1 位于同一个程序集中。

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

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

<强>更新

如果您没有为 UserControl1 定义任何默认样式,则无需使用 BasedOn ,因为没有默认样式为您的UserControl存在。这就是你得到例外的原因。

删除BasedOn,它会正常工作。


您在XAML中定义的资源不是默认样式,而是本地StyleControl样式,如果您在MainWindow中定义另一个本地资源,它将被覆盖。

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

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

现在在MainWindow.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>