XAML:将样式应用于嵌套控件

问题描述 投票:3回答:4

在WPF中,Prism v4,我有一个ToolBar充当区域。在该区域中,我注入UserControls,其中包含工具栏的按钮和分隔符。问题在于,由于按钮现在位于UserControl中,因此工具栏样式不再适用。

可以通过定义样式来解决这个问题:

<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}"/>
<Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"/>

但是我想避免这种情况,因为我有数百个按钮。所以我的问题是,是否可以从资源字典中为工具栏下的所有按钮定义样式?

谢谢!

wpf xaml styles
4个回答
3
投票

您可以使用类似:

<Style TargetType="Separator" BasedOn="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
<Style TargetType="Button" BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" />

如果将其放在ToolBar资源中,则它将应用于其中的任何按钮。


6
投票

CodeNaked和Marat Khasanov提到的相同技术也可以在默认的ToolBar样式中使用,因此您不必在本地重置它们。

    <Style TargetType="{x:Type ToolBar}">
        <Style.Resources>
            <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" />
            <Style TargetType="{x:Type Separator}" BasedOn="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
        </Style.Resources>
        <!-- etc... -->
    </Style>

我希望这是ToolBar的默认行为,但我发现它需要显式定义。

希望有帮助。 :)


2
投票

将基本样式放入工具栏资源:

<ToolBar>
    <ToolBar.Resources>
        <Style TargetType="{x:Type Button}"
               BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"/>
        <Style TargetType="{x:Type Separator}"
               BasedOn="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}"/>
    </ToolBar.Resources>
    ...
</ToolBar>

0
投票

我喜欢@CodeNaked的解决方案,但是不知为何我在菜单分隔符的使用上苦苦挣扎。这是我的代码:

<Menu>
    <Menu.Resources>
        <Style TargetType="MenuItem">
            <Setter Property="Padding" Value="0,0,0,0"/>
        </Style>
        <Style TargetType="Separator" BasedOn="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
    </Menu.Resources>

    <MenuItem Header="Foo"></MenuItem>
    <Separator/>
    <MenuItem Header="Bar"></MenuItem>
</Menu>

如果我将样式直接放在分隔符上,它将起作用。

<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}"/>

您知道为什么它不起作用吗?

© www.soinside.com 2019 - 2024. All rights reserved.