使用 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" />

以下是针对您的问题的可能解决方案。

  1. 简单,但有点丑。

在代码隐藏中为菜单项的 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" 是 Fl​​uent 主题中定义的控件模板部分。

  1. 创建您自己的样式和控件模板。

由于不能继承控件模板,所以只能从Fluent主题中复制过来放到资源中。缺点是如果有更新,您必须手动将该模板与原始模板重新同步。

我不在这里举个例子,因为那个解决方案也不是很好。

  1. 手动覆盖菜单项样式。

手动将菜单项的样式设置为 "first level" 菜单项的样式。

<Fluent:MenuItem Style="{DynamicResource ApplicationMenuStyle}"/>