WPF。如何使分隔符拉伸到菜单宽度?

WPF. How to make a separator stretching to menu width?

这可能是一个愚蠢的问题...但我找不到另一个问题来回答它,也找不到 post 可以帮助我实现我想要的。

我有以下 XAML:

<Menu>
    <Menu.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </Menu.ItemsPanel>
    <MenuItem Header="Item1" />
    <Separator VerticalContentAlignment="Stretch" VerticalAlignment="Stretch"
               HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" />
    <MenuItem Header="Item2" />
</Menu>

在我的 real-life 业务案例中,header 更复杂,有图像和其他一些东西。

问题是上面的 xaml 产生了以下输出:

如您所见,分隔符没有拉伸。这似乎是一项非常简单的任务...但我还没有找到解决方案。

我尝试过将样式设置为 ItemContainerStyle,我将 HorizontalContentAlignment 的值设置为 Stretch,但没有成功。

我只是使用网格而不是堆栈面板制作的。我希望这对你有用!

<Menu >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <MenuItem Header="Item1" />
        <Separator Grid.Row="1" />
        <MenuItem Grid.Row="2" Header="Item2" />
    </Grid>
</Menu>

默认模板包含边距。您可以通过定义自己的自定义模板来删除它:

<Separator>
    <Separator.Template>
        <ControlTemplate TargetType="{x:Type Separator}">
            <Border Background="{TemplateBinding Control.Background}"
                    BorderBrush="{TemplateBinding Control.BorderBrush}"
                    BorderThickness="{TemplateBinding Control.BorderThickness}" Margin="0"/>
        </ControlTemplate>
    </Separator.Template>
</Separator>

默认值在 Windows 8 及更高版本上看起来像这样,即 Border 元素具有 hard-coded left-margin 的 30 DIP:

<ControlTemplate TargetType="{x:Type Separator}">
    <Border Background="{TemplateBinding Control.Background}"
            BorderBrush="{TemplateBinding Control.BorderBrush}"
            BorderThickness="{TemplateBinding Control.BorderThickness}" Margin="30,0,0,0"/>
</ControlTemplate>

如果您的 Menu 包含多个分隔符,您可以使用隐式 Style:

<Menu>
    <Menu.Resources>
        <Style x:Key="{x:Static MenuItem.SeparatorStyleKey}" TargetType="{x:Type Separator}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Separator}">
                        <Border Background="{TemplateBinding Control.Background}"
                                BorderBrush="{TemplateBinding Control.BorderBrush}"
                                BorderThickness="{TemplateBinding Control.BorderThickness}" 
                                Margin="0"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Menu.Resources>
    <Menu.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </Menu.ItemsPanel>
    <MenuItem Header="Item1" />
    <Separator />
    <MenuItem Header="Item2" />
    <Separator />
</Menu>