WPF:按键寻址嵌套样式

amu*_*are 4 c# wpf xaml

我有一个相当复杂的 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 这样的尴尬按键?

小智 7

也许DynamicResource可以解决你的问题

<Grid>
    <Button Style="{DynamicResource ButtonA}"/>
    <Button Style="{DynamicResource ButtonB}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

在上下文中:

<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>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述