C# WPF菜单项自定义模板

3
在Main.xaml中,我有这两个菜单项:
  • 第一个标题为断开当前连接
  • 第二个标题为退出
  • ...
  • 更多带有不同标题文本的菜单项...
为了编辑第一个项目的一些颜色,我在App.xaml中创建了一个自定义模板:
<!--Template for Menu Items-->
    <Style x:Key="MenuItemBaseStyle" TargetType="MenuItem">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="Background" Value="#0a99f3" />
                <Setter Property="Foreground" Value="White"/>
            </Trigger>
        </Style.Triggers>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type MenuItem}">
                    <Grid Background="{TemplateBinding Background}">
                        <MenuItem Header="DISCONNECT FROM CURRENT" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

在Main.xaml中:

<MenuItem Header="CONNECTION">
    <MenuItem Style="{StaticResource MenuItemBaseStyle}" Header="DISCONNECT FROM CURRENT" />
    <MenuItem Header="QUIT"/>
</MenuItem>

现在,我希望对第二个菜单项执行相同的操作。问题出在不同的页眉上。如果我从模板中删除页眉,即使主要.xaml中仍然存在页眉文本,也不会显示任何页眉。
我该如何使用此模板制作多个菜单项,在这些菜单项中唯一更改的是页眉文本?
2个回答

2
你可以在与Background属性使用类似的方式上,在Header属性上直接使用TemplateBinding:
<ControlTemplate TargetType="{x:Type MenuItem}">
    <Grid Background="{TemplateBinding Background}">
         <MenuItem Header="{TemplateBinding Header}" />
    </Grid>
</ControlTemplate>

如果您有任何建议或评论等,可以在这里查看我的类似帖子:https://stackoverflow.com/q/67767725/1232087。 - nam

1

您可以使用StyleSelector为每个MenuItem创建独立的样式。

public class MyStyleSelector : StyleSelector
{
    public override Style SelectStyle(object item, DependencyObject container)
    {
        var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
        var index = itemsControl.ItemContainerGenerator.IndexFromContainer(container);

        if (index == 0)
            return (Style)itemsControl.FindResource("FirstItemStyle");
        if (index == 1)
            return (Style)itemsControl.FindResource("SecondItemStyle");

        return base.SelectStyle(item, container);
    }
}

在你的 XAML 中。
<Window x:Class="Menus.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Menus"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <local:MyStyleSelector x:Key="MyStyleSelector" />

    <Style x:Key="FirstItemStyle"  TargetType="MenuItem">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="Background" Value="#0a99f3" />
                <Setter Property="Foreground" Value="White"/>
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style x:Key="SecondItemStyle"  TargetType="MenuItem">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="Background" Value="Red" />
                <Setter Property="Foreground" Value="White"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <Menu ItemContainerStyleSelector="{StaticResource MyStyleSelector}">
        <MenuItem Header="Menu 1" />
        <MenuItem Header="Menu 2" />
        <MenuItem Header="Menu 3" />
    </Menu>
</Grid>

在这里查看 StyleSelector: StyleSelector


3
Codebehind很不理想。 - AgentFire
5
你在哪里看到代码后面的内容? MyStyleSelector是一个独立的类。 - Ketobomb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接