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>
这可能是一个愚蠢的问题...但我找不到另一个问题来回答它,也找不到 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>