C# WPF:按键寻址嵌套样式
我有一个相当复杂的WPF用户控件,它需要很多自定义样式,并且对于相同的控件类型有几种不同的样式。其他地方不使用相同的样式 我想使用嵌套样式(使用C# WPF:按键寻址嵌套样式,c#,wpf,xaml,C#,Wpf,Xaml,我有一个相当复杂的WPF用户控件,它需要很多自定义样式,并且对于相同的控件类型有几种不同的样式。其他地方不使用相同的样式 我想使用嵌套样式(使用Style.Resources)作为一种名称空间机制,如下所示: 用户控件示例: 也许DynamicResource可以解决您的问题 <Grid> <Button Style="{DynamicResource ButtonA}"/> <Button Style="{DynamicResource Butto
Style.Resources
)作为一种名称空间机制,如下所示:
用户控件示例:
也许DynamicResource
可以解决您的问题
<Grid>
<Button Style="{DynamicResource ButtonA}"/>
<Button Style="{DynamicResource ButtonB}"/>
</Grid>
投票后:
<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>
我认为这是一个解决办法。。和thx的否决票。Critict总是更好:)您无法避免使用AwesomeControlButtonA
键或将它们设置为AwesomeControl.ButtonA
,其中AwesomeControl
可以以某种方式省略,因为资源键查找是简单的字典搜索。您只能使用范围(将其视为局部变量)。如果您计划全局保存样式,那么它将是AwesomeControlButtonA
。考虑一下,例如在最合适的范围内定义按钮,这样就不需要长键了。还有实现某种继承(意味着更少的键)别忘了,这种简单的关系是在“可视化”过程中建立的。所以没有一本简单的字典。VisualTree的元素根据在visal树中的位置有不同的字典。我不知道DynamicSource可以这样使用。谢谢你提供了一个很好的例子!(虽然我没有投反对票,但你的答案现在看起来确实漂亮多了。)我会调查一下,如果它对我有效(/如果没有更好的答案),我会接受你的。这就是DynamicResource
存在的原因。将样式
应用于用户控件
时,动态更改资源字典
中的AB
和BB
样式DynamicSource
注意到了它——因为它是一个表达式,而不是一个硬编码链接——并刷新了它自己。静态资源无法刷新。它是在XAML解析期间加载的,无法替换它。