使用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>
BasedOn
语法错误。应该是:
BasedOn="{StaticResource {x:Type local:UserControl1}}"
即使你得到设计错误,尝试重新编译你的代码。确保添加的命名空间正确映射到UserControl.
同时,确保MainWindow和UserControl1位于同一个程序集中。
如果它们位于不同的程序集中,则必须在命名空间声明中指定程序集名称:
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>