WPF工具栏 - 自定义样式

时间:2011-02-02 10:56:44

标签: wpf templates

我想更改wpf工具栏的标准样式。我在控制资源中使用以下样式,它可以正常工作:

<Style x:Key="{x:Type ToolBar}" TargetType="{x:Type ToolBar}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToolBar}">
                        <Border>
                            <DockPanel VerticalAlignment="Stretch" Height="38">
                            </DockPanel>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

但是,如果我将项目添加到工具栏,则不会显示这些项目:

<ToolBar x:Name="myToolbar">
        <Label>test</Label>
    </ToolBar>

我不想在模板中添加项目,而是在使用该模板的特定工具栏中添加。

任何人都可以给我一个提示吗?

2 个答案:

答案 0 :(得分:5)

问题是您用自己的工具栏替换了工具栏的控件模板。但是您没有在该模板中指定应显示项目的位置。通常你可以通过添加ItemsPresenter:

来实现
<ControlTemplate TargetType="{x:Type ToolBar}">
    <Border>
        <DockPanel VerticalAlignment="Stretch" Height="38">
            <ItemsPresenter/>
        </DockPanel>
    </Border>
</ControlTemplate>

或者在模板内的面板上设置IsItemsHost="True"

<ControlTemplate TargetType="{x:Type ToolBar}">
    <Border>
        <DockPanel IsItemsHost="True" VerticalAlignment="Stretch" Height="38">
        </DockPanel>
    </Border>
</ControlTemplate>

但是,如果您尝试替换ToolBar的items面板(如我的第二个示例中所示),它将无法工作,因为ToolBar期望ToolBarPanel成为items面板。

答案 1 :(得分:0)

模板定义了控件的呈现方式,对于某些控件,一切都在模板内,控件希望在模板中找到它将操作的命名元素。如果查看ToolBar模板,您可以看到工具栏需要在模板中找到名为PART_ToolBarPanel的元素和名为PART_ToolBarOverflowPanel的元素:

http://msdn.microsoft.com/en-us/library/aa970772.aspx

例如,它需要找到名为PART_ToolBarPanel的元素,以便将项目添加到工具栏。

如果要向工具栏模板添加新元素,通常首先复制现有模板,然后开始添加/删除元素。