我有一个相当复杂的 WPF UserControl,需要大量自定义样式,以及相同控件类型的几种不同样式。相同的样式没有在任何其他地方使用。
我想使用嵌套样式(使用Style.Resources)作为一种命名空间机制,如下所示:
用户控件示例:
<UserControl Style="{StaticResource AwesomeControl}>
<Grid>
<Button Style="{StaticResource ButtonA}"/>
<Button Style="{StaticResource ButtonB}"/>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
我想如何定义我的风格:
<ResourceDictionary>
<Style TargetType="UserControl" x:Key="AwesomeControl">
<Style.Resources>
<Style TargetType="Button" x:Key="ButtonA"> </Style>
<Style TargetType="Button" x:Key="ButtonB"> </Style>
</Style.Resources>
</Style>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
然而,这是行不通的。据我所知,似乎不可能通过键来处理嵌套样式。(我已经搜索了很多,但找不到一个例子来做这样的事情。)
我可以通过删除样式的嵌套并将它们全部保持在顶层来使其轻松工作。但是,然后我必须将它们的键更改为 等AwesomeControlButtonA,以将它们与应用程序的其他部分区分开来
这对我来说似乎并不理想。
所以我的问题是:
像我尝试使用上面的代码可能吗?如果没有,是否可以使用其他命名空间方法来防止像 AwesomeControlButtonA 这样的尴尬按键?
与这个问题类似,我正在尝试尽可能轻松地设置ComboBoxItems的样式。但是,我正在根据此处找到的ComboBox的默认样式制作自定义样式。
<Style x:Key="MultiComboBox" TargetType="{x:Type ComboBox}">
<Style.Resources>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="Style" Value="{StaticResource MultiComboBoxItem}"/>
</Style>
</Style.Resources>
<Setter Property="SnapsToDevicePixels" Value="true" />
<!--<Setter Property="OverridesDefaultStyle" Value="true" />-->
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
...
...
</Style>
.
.
.
<ComboBox Style="{StaticResource MyComboBox}">
<ComboBoxItem x:Name="First">First</ComboBoxItem>
<ComboBoxItem x:Name="Second">Second</ComboBoxItem>
<ComboBoxItem x:Name="Third">Third</ComboBoxItem>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
我将其添加<Style.Resources>到顶部,希望这里只需要一个引用,而不是将其单独添加到嵌套元素中,或者甚至首先需要将其添加到元素中。另外,我评论了所有的OverridesDefaultStyle二传手。
但是,然后我得到一个XAMLparseexception,“不允许Style对象影响所应用对象的Style属性”。该错误本身是有道理的,但是我认为自从定位以来,ComboBoxItem它应该可以工作。有没有解决的办法?