首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# WPF MenuItem自定义模板

C# WPF MenuItem自定义模板
EN

Stack Overflow用户
提问于 2014-07-16 16:54:48
回答 2查看 29.1K关注 0票数 3

在Main.xaml中,我有以下两个菜单项:

  • 头=与当前断开连接的第一个
  • 第二个标题=退出
  • ..。
  • 更多带有不同标题文本的菜单项..。

为了编辑第一项的某些颜色,我在App.xaml中创建了一个自定义模板:

代码语言:javascript
运行
复制
<!--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中:

代码语言:javascript
运行
复制
<MenuItem Header="CONNECTION">
    <MenuItem Style="{StaticResource MenuItemBaseStyle}" Header="DISCONNECT FROM CURRENT" />
    <MenuItem Header="QUIT"/>
</MenuItem>

现在,我想对第二个菜单项做同样的操作。问题在于不同的标题。如果我从模板中删除标题,即使标题文本仍然存在于Main.xaml中,它也不会显示任何标题

如何将此模板用于许多菜单项,其中唯一更改的是标题文本?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-16 17:06:06

您只需在标题属性上使用标题,就像在Background属性上使用它一样:

代码语言:javascript
运行
复制
<ControlTemplate TargetType="{x:Type MenuItem}">
    <Grid Background="{TemplateBinding Background}">
         <MenuItem Header="{TemplateBinding Header}" />
    </Grid>
</ControlTemplate>
票数 2
EN

Stack Overflow用户

发布于 2014-07-17 11:23:26

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

代码语言:javascript
运行
复制
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中

代码语言:javascript
运行
复制
<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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24786479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档