使用 C# WPF 在 Fluent Ribbon 中垂直居中 MenuItem 文本
Vertically Centering MenuItem text in a Fluent Ribbon with C# WPF
我正在使用 Fluent.Ribbon,我拼命尝试将二级菜单项的文本垂直居中。如果这样更容易的话,我实际上不介意让二级项目与一级项目具有相同的样式。
通过挖掘源代码,我 认为 我发现单独的样式是由 ControlTemplate
ApplicationMenuSecondLevelItemTemplate
定义的。但是,由于我正在学习 WPF,我不确定如何用样式覆盖它。
我试过更简单的解决方案,比如 this one 只是让文字消失。
我也尝试了 this post 中的所有选项。但是,none 这些都可以工作,当我将最后一个修复为以下以消除错误时,应用程序就崩溃了。
<Style x:Key="CenteredTextMenuItem" TargetType="{x:Type MenuItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<TextBox Text="{Binding}" HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center" FontSize="16" FontWeight="Bold"/>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Height" Value="30"/>
<Setter Property="Width" Value="188"/>
</Style>
如何使用 Fluent.Ribbon
控件将第二级 MenuItem
的文本居中?
谢谢。
编辑:
这是一张图片,显示了第二层如何不居中。
代码没有什么复杂的:
<Fluent:MenuItem Header="Print Invoice" Icon="NavIcons\Print_32.png" />
以下是针对您的问题的可能解决方案。
- 简单,但有点丑。
在代码隐藏中为菜单项的 Loaded
事件创建一个事件处理程序。
<Fluent:MenuItem Loaded="MenuItem_Loaded"/>
在此事件处理程序中,您可以手动找到控件模板部件并覆盖它们的外观:
private void MenuItem_Loaded(object sender, RoutedEventArgs e)
{
Fluent.MenuItem menuItem = sender as Fluent.MenuItem;
if (menuItem != null)
{
TextBlock textBlock = menuItem.Template.FindName("textBlockDesc", menuItem) as TextBlock;
if (textBlock != null)
{
textBlock.Visibility = System.Windows.Visibility.Collapsed;
}
textBlock = menuItem.Template.FindName("textBlock", menuItem) as TextBlock;
if (textBlock != null)
{
textBlock.VerticalAlignment = System.Windows.VerticalAlignment.Center;
}
}
}
这是一个糟糕的解决方案,不要那样做。我刚刚展示了它,因此您可以了解如何访问模板部分(如果您愿意)。这些字符串 "textBlockDesc"
和 "textBlock"
是 Fluent 主题中定义的控件模板部分。
- 创建您自己的样式和控件模板。
由于不能继承控件模板,所以只能从Fluent主题中复制过来放到资源中。缺点是如果有更新,您必须手动将该模板与原始模板重新同步。
我不在这里举个例子,因为那个解决方案也不是很好。
- 手动覆盖菜单项样式。
手动将菜单项的样式设置为 "first level" 菜单项的样式。
<Fluent:MenuItem Style="{DynamicResource ApplicationMenuStyle}"/>
我正在使用 Fluent.Ribbon,我拼命尝试将二级菜单项的文本垂直居中。如果这样更容易的话,我实际上不介意让二级项目与一级项目具有相同的样式。
通过挖掘源代码,我 认为 我发现单独的样式是由 ControlTemplate
ApplicationMenuSecondLevelItemTemplate
定义的。但是,由于我正在学习 WPF,我不确定如何用样式覆盖它。
我试过更简单的解决方案,比如 this one 只是让文字消失。
我也尝试了 this post 中的所有选项。但是,none 这些都可以工作,当我将最后一个修复为以下以消除错误时,应用程序就崩溃了。
<Style x:Key="CenteredTextMenuItem" TargetType="{x:Type MenuItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<TextBox Text="{Binding}" HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center" FontSize="16" FontWeight="Bold"/>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Height" Value="30"/>
<Setter Property="Width" Value="188"/>
</Style>
如何使用 Fluent.Ribbon
控件将第二级 MenuItem
的文本居中?
谢谢。
编辑:
这是一张图片,显示了第二层如何不居中。
代码没有什么复杂的:
<Fluent:MenuItem Header="Print Invoice" Icon="NavIcons\Print_32.png" />
以下是针对您的问题的可能解决方案。
- 简单,但有点丑。
在代码隐藏中为菜单项的 Loaded
事件创建一个事件处理程序。
<Fluent:MenuItem Loaded="MenuItem_Loaded"/>
在此事件处理程序中,您可以手动找到控件模板部件并覆盖它们的外观:
private void MenuItem_Loaded(object sender, RoutedEventArgs e)
{
Fluent.MenuItem menuItem = sender as Fluent.MenuItem;
if (menuItem != null)
{
TextBlock textBlock = menuItem.Template.FindName("textBlockDesc", menuItem) as TextBlock;
if (textBlock != null)
{
textBlock.Visibility = System.Windows.Visibility.Collapsed;
}
textBlock = menuItem.Template.FindName("textBlock", menuItem) as TextBlock;
if (textBlock != null)
{
textBlock.VerticalAlignment = System.Windows.VerticalAlignment.Center;
}
}
}
这是一个糟糕的解决方案,不要那样做。我刚刚展示了它,因此您可以了解如何访问模板部分(如果您愿意)。这些字符串 "textBlockDesc"
和 "textBlock"
是 Fluent 主题中定义的控件模板部分。
- 创建您自己的样式和控件模板。
由于不能继承控件模板,所以只能从Fluent主题中复制过来放到资源中。缺点是如果有更新,您必须手动将该模板与原始模板重新同步。
我不在这里举个例子,因为那个解决方案也不是很好。
- 手动覆盖菜单项样式。
手动将菜单项的样式设置为 "first level" 菜单项的样式。
<Fluent:MenuItem Style="{DynamicResource ApplicationMenuStyle}"/>