[英]Vertically Centering MenuItem text in a Fluent Ribbon with C# WPF
我正在使用Fluent.Ribbon ,我极力尝试垂直放置第二级菜单项的文本。 我实际上不介意使第二级具有与第一级项目相同的样式,如果那样会更容易。
通过仔细研究源代码,我认为我发现单独的样式是由ControlTemplate
ApplicationMenuSecondLevelItemTemplate
定义的。 但是,由于我正在学习WPF,因此我不确定如何用样式覆盖它。
我试过简单的解决方案,像这样一个刚刚使文本消失。
在这篇文章中,我还尝试了所有选项。 但是,这些都不起作用,而当我将最后一个修复为以下错误以消除错误时,应用程序将崩溃。
<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.Ribbon
?
谢谢。
编辑:
这是一个图像,显示第二级如何不居中。
而且没有什么复杂的代码:
<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主题复制它并将其放入资源中。 缺点是,如果要进行更新,则必须手动将该模板与原始模板重新同步。
我在这里不举一个例子,因为该解决方案也不是很好。
手动将菜单项的样式设置为“第一级”菜单项的样式。
<Fluent:MenuItem Style="{DynamicResource ApplicationMenuStyle}"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.