WPF:按键

时间:2015-06-25 08:07:55

标签: c# wpf xaml

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

1 个答案:

答案 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>

enter image description here

我认为这是一个解决方案..而且是投票的首选。批评总是更好:)