C# WPF 内容展示器 MenuItem TextAlignment
C# WPF ContentPresenter MenuItem TextAlignment
首先我想说明一下,我是 C# WPF 的新手。
我已经搜索了很多,但到目前为止我还没有找到合适的解决方案,我希望现在有人可以帮助我。
现在我的问题是:
我有一个 C# WPF 应用程序,其中有一个菜单。我正在使用 Window.Resoucres 区域为 x:Type MenuItem 定义一个新模板。
这到目前为止有效。
不过我没有弄出来,把文字居中放在多行(Multiline)菜单上。
我有一个带有文本 "Costs Overview" 的菜单项。这个应该居中显示,因为我已经给菜单定了宽度。
我想要这样的东西(刚好居中):
Costs
Overview
这是我目前使用的样式模板:
<Style x:Key="MenuItem" TargetType="{x:Type MenuItem}">
<Setter Property="Background" Value="#FF6C6D6E"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="{x:Null}"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Width" Value="60"/>
<Setter Property="Height" Value="90"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="Center" >
<Grid>
<!-- ContentPresenter to show an Icon -->
<ContentPresenter Margin="0,10,0,35" x:Name="Icon" VerticalAlignment="Center" ContentSource="Icon"/>
<!-- Content for the menu text etc -->
<ContentPresenter Margin="0,55,0,0" VerticalAlignment="Top" HorizontalAlignment="Center" ContentSource="Header" RecognizesAccessKey="True" />
</Grid>
</Border>
<!-- These triggers re-configure the four arrangements of MenuItem to show different levels of menu via Role -->
<ControlTemplate.Triggers>
<!-- Role = TopLevelItem : this is a child menu item from the top level without any child items-->
<Trigger Property="Role" Value="TopLevelItem">
<Setter Property="Padding" Value="0"/>
<Setter Property="BorderBrush" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Width" Value="80" />
<Setter Property="Height" Value="80" />
<Setter Property="HorizontalAlignment" Value="Center" />
</Trigger>
<!-- Using colors for the Menu Highlight and IsEnabled-->
<Trigger Property="IsHighlighted" Value="true">
<Setter Property="Background" Value="#FF939498" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF939498" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这种风格使我的菜单看起来像这样。
如您所见,菜单中的文本未居中。
我已经尝试了一些解决方案,例如在 ContentPresenter 中设置 TextBlock 以设置 TextAlignment="Center" 属性,但我不知道如何在 TextBlock 绑定中获取 MenuItem 文本。
我还尝试将 TextBlock.TextAlignment="Center" 属性设置为 ContentPresenter,但它也不起作用。
如您所见,我的菜单还有另一个问题。你知道吗,当我将鼠标悬停在 MenuItem 上时如何移除蓝色焦点?正常的悬停样式是菜单会变成浅灰色,就像在按钮中间一样。另外我的 MenuItem 没有使用菜单的整个宽度...
我期待每一个想法。
提前致谢!
解决方案
bars22 给了我正确的提示..
我忘了我有一个更深几行的普通菜单。我只是在看 ControlTemplate...
这是我的解决方案:
我保留了 MenuItem 的样式,并将我的菜单更改为以下内容:
<Menu Background="{x:Null}" ItemsSource="{Binding PageViewModels}">
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<Menu.ItemTemplate>
<DataTemplate>
<MenuItem Icon="{Binding Icon}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"
Style="{StaticResource MenuItem}">
<MenuItem.Header>
<StackPanel>
<TextBlock TextAlignment="Center" Text="{Binding Name}" />
</StackPanel>
</MenuItem.Header>
</MenuItem>
</DataTemplate>
</Menu.ItemTemplate>
</Menu>
您可以将内容演示者的容器更改为 StackPanel
。
<StackPanel>
<!-- ContentPresenter to show an Icon -->
<ContentPresenter x:Name="Icon" ContentSource="Icon"/>
<!-- Content for the menu text etc -->
<ContentPresenter ContentSource="Header" RecognizesAccessKey="True" />
</StackPanel>
我已经对这些 MenuItems
进行了测试。这是两个不同的变体。我觉得挺好看的
<Menu DockPanel.Dock="Top" Background="white">
<MenuItem Header="Test">
<MenuItem Style="{StaticResource MenuItem}">
<MenuItem.Header>
<TextBlock Text="Costs Overview" HorizontalAlignment="Center" TextWrapping="Wrap" />
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="/WPFTest;component/Images/Test.png" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Style="{StaticResource MenuItem}">
<MenuItem.Header>
<StackPanel>
<TextBlock HorizontalAlignment="Center" Text="Costs" />
<TextBlock HorizontalAlignment="Center" Text="Overview" />
</StackPanel>
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="/WPFTest;component/Images/Test.png" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
</Menu>
首先我想说明一下,我是 C# WPF 的新手。 我已经搜索了很多,但到目前为止我还没有找到合适的解决方案,我希望现在有人可以帮助我。
现在我的问题是:
我有一个 C# WPF 应用程序,其中有一个菜单。我正在使用 Window.Resoucres 区域为 x:Type MenuItem 定义一个新模板。 这到目前为止有效。
不过我没有弄出来,把文字居中放在多行(Multiline)菜单上。
我有一个带有文本 "Costs Overview" 的菜单项。这个应该居中显示,因为我已经给菜单定了宽度。
我想要这样的东西(刚好居中):
Costs
Overview
这是我目前使用的样式模板:
<Style x:Key="MenuItem" TargetType="{x:Type MenuItem}">
<Setter Property="Background" Value="#FF6C6D6E"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="{x:Null}"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Width" Value="60"/>
<Setter Property="Height" Value="90"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="Center" >
<Grid>
<!-- ContentPresenter to show an Icon -->
<ContentPresenter Margin="0,10,0,35" x:Name="Icon" VerticalAlignment="Center" ContentSource="Icon"/>
<!-- Content for the menu text etc -->
<ContentPresenter Margin="0,55,0,0" VerticalAlignment="Top" HorizontalAlignment="Center" ContentSource="Header" RecognizesAccessKey="True" />
</Grid>
</Border>
<!-- These triggers re-configure the four arrangements of MenuItem to show different levels of menu via Role -->
<ControlTemplate.Triggers>
<!-- Role = TopLevelItem : this is a child menu item from the top level without any child items-->
<Trigger Property="Role" Value="TopLevelItem">
<Setter Property="Padding" Value="0"/>
<Setter Property="BorderBrush" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Width" Value="80" />
<Setter Property="Height" Value="80" />
<Setter Property="HorizontalAlignment" Value="Center" />
</Trigger>
<!-- Using colors for the Menu Highlight and IsEnabled-->
<Trigger Property="IsHighlighted" Value="true">
<Setter Property="Background" Value="#FF939498" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF939498" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这种风格使我的菜单看起来像这样。
如您所见,菜单中的文本未居中。 我已经尝试了一些解决方案,例如在 ContentPresenter 中设置 TextBlock 以设置 TextAlignment="Center" 属性,但我不知道如何在 TextBlock 绑定中获取 MenuItem 文本。
我还尝试将 TextBlock.TextAlignment="Center" 属性设置为 ContentPresenter,但它也不起作用。
如您所见,我的菜单还有另一个问题。你知道吗,当我将鼠标悬停在 MenuItem 上时如何移除蓝色焦点?正常的悬停样式是菜单会变成浅灰色,就像在按钮中间一样。另外我的 MenuItem 没有使用菜单的整个宽度...
我期待每一个想法。
提前致谢!
解决方案
bars22 给了我正确的提示..
我忘了我有一个更深几行的普通菜单。我只是在看 ControlTemplate...
这是我的解决方案:
我保留了 MenuItem 的样式,并将我的菜单更改为以下内容:
<Menu Background="{x:Null}" ItemsSource="{Binding PageViewModels}">
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<Menu.ItemTemplate>
<DataTemplate>
<MenuItem Icon="{Binding Icon}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"
Style="{StaticResource MenuItem}">
<MenuItem.Header>
<StackPanel>
<TextBlock TextAlignment="Center" Text="{Binding Name}" />
</StackPanel>
</MenuItem.Header>
</MenuItem>
</DataTemplate>
</Menu.ItemTemplate>
</Menu>
您可以将内容演示者的容器更改为 StackPanel
。
<StackPanel>
<!-- ContentPresenter to show an Icon -->
<ContentPresenter x:Name="Icon" ContentSource="Icon"/>
<!-- Content for the menu text etc -->
<ContentPresenter ContentSource="Header" RecognizesAccessKey="True" />
</StackPanel>
我已经对这些 MenuItems
进行了测试。这是两个不同的变体。我觉得挺好看的
<Menu DockPanel.Dock="Top" Background="white">
<MenuItem Header="Test">
<MenuItem Style="{StaticResource MenuItem}">
<MenuItem.Header>
<TextBlock Text="Costs Overview" HorizontalAlignment="Center" TextWrapping="Wrap" />
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="/WPFTest;component/Images/Test.png" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Style="{StaticResource MenuItem}">
<MenuItem.Header>
<StackPanel>
<TextBlock HorizontalAlignment="Center" Text="Costs" />
<TextBlock HorizontalAlignment="Center" Text="Overview" />
</StackPanel>
</MenuItem.Header>
<MenuItem.Icon>
<Image Source="/WPFTest;component/Images/Test.png" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
</Menu>