WPF MenuItem内容“名称”

时间:2010-05-31 14:44:44

标签: wpf menuitem

我有很多MenuItem,我希望能够更改他们的“内容”,以便它显示在程序中。当我加载程序时,他们的“内容名称”在我创建的Setter中设置..但唯一的问题是我有近百个MenuItem对象,我需要他们在程序中的显示名称是不同的(不是setter的默认值)。我可以创建超过100个不同的“Setter”并在其中更改一行..但这非常耗时。有更简单的方法吗?我希望能够在我声明它们的XAML中执行此操作。有没有办法做到这一点?我一直在寻找和尝试不同的尝试,但到目前为止还没有...也许有人知道?

编辑:

抱歉,也许我有点不清楚..

我已经创建了MenuItems,它们基于我创建的Setter ......问题是..我现在希望每个人仍然基于Setter,但要有一个独特的“内容”/为用户显示的名称...目前,它们都具有setter为其提供的“Content”名称,但我正在寻找通过XAML设置每个MenuItem的内容名称的方法..这可能吗?

由于

2 个答案:

答案 0 :(得分:0)

你的问题不明确。我认为创建数百个菜单项的最佳方法是从不在XAML中的代码创建它们。例如在foreach循环中。那么你可以给每个人一个独特而有意义的名字。请更清楚地描述您的问题。

谢谢

答案 1 :(得分:0)

现在我理解你的问题了。通常我认为在XAML文件中为每个menuItem设置content属性是一个非常糟糕的主意。特别是当你处理数百件物品时。更好的方法是使用WPF和DataTemplates的数据绑定功能,而不是硬编码XAML文件中的menuItem名称。我会为你的问题提出两个解决方案。第一个解决方案使用代码隐藏方法创建菜单项,然后将它们绑定到MainMenu的ItemsSource属性,而不使用dataTemplates。以下代码是窗口的代码隐藏代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MenuItems = new ObservableCollection<MenuItem>();

        for (int i = 0; i < 40; i++)
        {
            MenuItem menuItem = new MenuItem();
            menuItem.Header = "MenuItem" + i.ToString();
            MenuItems.Add(menuItem);
        }

        MainMenu.DataContext = this;
    }

    public ObservableCollection<MenuItem> MenuItems
    {
        get;
        set;
    }
}

在这段代码中,我们首先创建了40个menuItem,然后将它们绑定到MainMenu对象的DataContext属性。以下代码显示了Windows的XAML代码,包括它的MainMenu对象:

<Window x:Class="WpfApplication17.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0" Name="MainMenu" ItemsSource="{Binding MenuItems}">

        </Menu>
    </Grid>
</Window> 

在这个approch中,您可以先在代码中创建所有菜单项及其名称,然后将它们绑定到Menu对象。然后你可以使用样式来设置菜单项的常用属性。

但更好的解决方案是使用dataTemplates,就像我在下面的代码中所做的那样。在这种方法中,首先您创建了一个用于存储菜单项名称的类。然后借助WPF的数据模板功能,您可以将它们绑定到MainMenu项目。该解决方案的代码隐藏如下:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MenuItems = new ObservableCollection<CustomMenuItem>();

        MenuItems.Add(new CustomMenuItem("Item 1"));
        MenuItems.Add(new CustomMenuItem("Item 2"));
        MenuItems.Add(new CustomMenuItem("Item 3"));

        MainMenu.DataContext = this;
    }

    public ObservableCollection<CustomMenuItem> MenuItems
    {
        get;
        set;
    }
}

public class CustomMenuItem
{
    public string Name { get; set; }

    public CustomMenuItem(string name)
    {
        Name = name;
    }
}

在这段代码中,我使用CustomMenuItem类来存储menuitem名称。 MainWindows构造函数可用于创建菜单项,但您可以从其他源检索它们,例如数据库的XML文件。 MainWindow的XAML代码是这样的:

<Window x:Class="WpfApplication17.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication17"
        Title="MainWindow" Height="350" Width="525" >
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:CustomMenuItem}">
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0" Name="MainMenu" ItemsSource="{Binding MenuItems}">

        </Menu>
    </Grid>
</Window>

通过这种方式,您可以从XML文件或其他数据源中检索您的菜单项名称,例如,它们不会硬编码到您的XAML文件中。然后,您可以使用DataTemplates的强大功能以您喜欢的方式查看菜单项。