这可能是一个愚蠢的问题......但我无法找到另一个可以回答它的问题,也找不到可以帮助我实现我想要的目标的帖子。
我有以下 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>
Run Code Online (Sandbox Code Playgroud)
在我现实生活中的业务案例中,标题更加复杂,包含图像和其他一些内容。
问题是上面的 xaml 产生以下输出:
正如您所看到的,分隔符没有拉伸。这似乎是一个非常简单的任务......但我还没有找到解决方案。
我尝试过将样式设置为ItemContainerStyle我赋予HorizontalContentAlignment值的位置Stretch,但它不起作用。
默认模板包含边距。您可以通过定义自己的自定义模板来删除它:
<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>
Run Code Online (Sandbox Code Playgroud)
在 Windows 8 及更高版本上,默认元素看起来像这样,即该元素具有硬编码的DIPBorder左边距:30
<ControlTemplate TargetType="{x:Type Separator}">
<Border Background="{TemplateBinding Control.Background}"
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="{TemplateBinding Control.BorderThickness}" Margin="30,0,0,0"/>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
如果您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>
Run Code Online (Sandbox Code Playgroud)