WPF工具栏分隔符在StackPanel内部时会缩小为零

8

假设有一个非常简单的WPF应用程序

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="800">
    <Grid>
        <ToolBar Height="50" >
            <MenuItem Header="Test1" />
            <MenuItem Header="Test2" />

            <StackPanel Orientation="Horizontal">
                <Separator />
                <MenuItem Header="Test3" />
                <MenuItem Header="Test4" />
                <MenuItem Header="Test5" />
            </StackPanel>
        </ToolBar>
    </Grid>
</Window>

分隔符元素会缩小到零。如果我将分隔符放在 StackPanel 开始之前,它就会显示出来。为什么会这样?是否有样式设置可以应用于某个地方以避免这种情况?
3个回答

16

StackPanel 在某种程度上改变了 Separator 的方向。请注意,如果您明确告诉 Separator 宽度为20个单位,则 Separator 将成为一条水平线而不是垂直线。 这是问题的一部分。

如果将 LayoutTransform 应用于 Separator,它将撤消 StackPanel 所做的任何更改。

<Separator>
    <Separator.LayoutTransform>
        <RotateTransform
            Angle="90" />
    </Separator.LayoutTransform>
</Separator>

我不明白为什么需要一个StackPanel


我正在将StackPanel的可见性绑定到禁用功能组。 - kenwarner
实际上,StackPanel并没有改变分隔符的方向;分隔符默认为水平方向。是ToolBar为您更改方向为垂直方向;但如果分隔符不是ToolBar的直接子级,则无法获得此好处。请参见下面的答案。 - stone

4
分隔符默认为水平方向。
直接放置在工具栏内部的分隔符会改变其样式,因为工具栏会覆盖其子项的默认样式。放置在其他地方的分隔符会获得分隔符的默认样式。如果您想将其保留在StackPanel中,则需要自己设置分隔符的样式。 此CodeProject讨论包括实现此操作的示例代码。
参考:Adam Nathan的《WPF Unleashed》,第117页。

2

工具栏对你放置的内容非常敏感。如果所有元素不是直接放在工具栏内,它们会变得很奇怪。分组元素包括ToolBarTray(工具栏组)、ToolBar(工具栏)和ToolBarPanel(逻辑上用于折叠溢出)。这是WPF想要看到的:

<Grid>
    <ToolBarTray>
        <ToolBar Height="Auto">
            <ToolBarPanel Orientation="Horizontal" ToolBar.OverflowMode="AsNeeded"/>
            <MenuItem Header="Test1" />
            <Separator/>
            <MenuItem Header="Test2" />
        </ToolBar>
        <ToolBar Height="Auto">
            <ToolBarPanel ToolBar.OverflowMode="Never"/>
            <MenuItem Header="Test3" />
            <MenuItem Header="Test4" />
            <Separator/>
            <MenuItem Header="Test5" />
            <ToolBarPanel ToolBar.OverflowMode="AsNeeded"/>
            <MenuItem Header="Test6" />
            <MenuItem Header="Test7" />
        </ToolBar>
    </ToolBarTray>
</Grid>

1
工具栏面板不应该包含菜单项和分隔符吗?即使这样做,分隔符仍然会翻转其方向。如果工具栏面板不应该包含菜单项,则绑定工具栏面板的可见性不会随之显示/隐藏菜单项。 - kenwarner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接