我有一个相当复杂的WPF UserControl,需要大量的自定义样式,以及相同控件类型的几种不同样式。任何其他地方都不使用相同的样式。
我想使用嵌套样式(使用Style.Resources
)作为一种命名空间机制,如下所示:
示例用户控制:
<UserControl Style="{StaticResource AwesomeControl}>
<Grid>
<Button Style="{StaticResource ButtonA}"/>
<Button Style="{StaticResource ButtonB}"/>
</Grid>
</UserControl>
我想要定义我的样式:
<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>
然而,这不起作用。据我所知,似乎不可能通过键来解决嵌套样式。 (我已经搜索了很多,但找不到这样的例子。)
我可以通过删除样式的嵌套,使它们全部保持在顶层,使其易于使用。但是,我必须将他们的密钥更改为AwesomeControlButtonA
等,以区别于应用程序的其他部分
这对我来说似乎并不理想。
所以我的问题是:
我可能会尝试使用上面的代码吗?如果没有,是否有其他方法可以使用命名空间来防止像AwesomeControlButtonA这样的笨拙键?
答案 0 :(得分:1)
也许DynamicResource
可以解决您的问题
<Grid>
<Button Style="{DynamicResource ButtonA}"/>
<Button Style="{DynamicResource ButtonB}"/>
</Grid>
在downvote之后:
<Grid>
<Grid.Resources>
<Style x:Key="AW" TargetType="UserControl">
<Style.Resources>
<Style TargetType="Button" x:Key="AB">
<Setter Property="Background" Value="Red" />
</Style>
<Style TargetType="Button" x:Key="BB">
<Setter Property="Background" Value="Yellow" />
</Style>
</Style.Resources>
</Style>
<Style x:Key="AR" TargetType="UserControl">
<Style.Resources>
<Style TargetType="Button" x:Key="AB">
<Setter Property="Background" Value="Green" />
</Style>
<Style TargetType="Button" x:Key="BB">
<Setter Property="Background" Value="Blue" />
</Style>
</Style.Resources>
</Style>
</Grid.Resources>
<StackPanel>
<UserControl Style="{StaticResource AW}">
<StackPanel>
<Button Content="A" Style="{DynamicResource AB}" />
<Button Content="A" Style="{DynamicResource BB}" />
</StackPanel>
</UserControl>
<UserControl Style="{StaticResource AR}">
<StackPanel>
<Button Content="A" Style="{DynamicResource AB}" />
<Button Content="A" Style="{DynamicResource BB}" />
</StackPanel>
</UserControl>
</StackPanel>
</Grid>
我认为这是一个解决方案..而且是投票的首选。批评总是更好:)