WPF:按键寻址嵌套样式

sdnqo3pr  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(152)

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

fd3cxomn

fd3cxomn1#

也许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>

相关问题