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