C# WPF:按键寻址嵌套样式

C# WPF:按键寻址嵌套样式,c#,wpf,xaml,C#,Wpf,Xaml,我有一个相当复杂的WPF用户控件,它需要很多自定义样式,并且对于相同的控件类型有几种不同的样式。其他地方不使用相同的样式 我想使用嵌套样式(使用Style.Resources)作为一种名称空间机制,如下所示: 用户控件示例: 也许DynamicResource可以解决您的问题 <Grid> <Button Style="{DynamicResource ButtonA}"/> <Button Style="{DynamicResource Butto

我有一个相当复杂的WPF用户控件,它需要很多自定义样式,并且对于相同的控件类型有几种不同的样式。其他地方不使用相同的样式

我想使用嵌套样式(使用
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解析期间加载的,无法替换它。