我有很多MenuItem,我希望能够更改他们的“内容”,以便它显示在程序中。当我加载程序时,他们的“内容名称”在我创建的Setter中设置..但唯一的问题是我有近百个MenuItem对象,我需要他们在程序中的显示名称是不同的(不是setter的默认值)。我可以创建超过100个不同的“Setter”并在其中更改一行..但这非常耗时。有更简单的方法吗?我希望能够在我声明它们的XAML中执行此操作。有没有办法做到这一点?我一直在寻找和尝试不同的尝试,但到目前为止还没有...也许有人知道?
编辑:
抱歉,也许我有点不清楚..
我已经创建了MenuItems,它们基于我创建的Setter ......问题是..我现在希望每个人仍然基于Setter,但要有一个独特的“内容”/为用户显示的名称...目前,它们都具有setter为其提供的“Content”名称,但我正在寻找通过XAML设置每个MenuItem的内容名称的方法..这可能吗?
由于
答案 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的强大功能以您喜欢的方式查看菜单项。