Теперь я понимаю вашу проблему. В общем, я думаю, что было бы очень плохой идеей установить свойство content для каждого из ваших элементов menu в файле XAML. Специально, когда вы имеете дело с сотнями предметов. Лучше использовать функцию привязки данных в WPF и DataTemplates, а не жестко кодировать имена menuItem в файле XAML. Я предложу два решения для вашей проблемы. Первое решение использует подход с выделенным кодом для создания элементов меню, а затем привязывает их к свойству ItemsSource MainMenu без использования 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 элементов menuItems, а затем привязали их к свойству DataContext объекта MainMenu. следующий код показывает код 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>
в этом подходе вы можете сначала создать все свои пункты меню и их имена в коде, а затем привязать их к объекту меню. тогда вы можете использовать стили для установки общих свойств пунктов меню.
но лучшим решением будет использование 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 для хранения имен пунктов меню. конструктор MainWindows отвечает за создание элементов меню, но вы можете получить их из других источников, например, из файла XML базы данных. код XAML для MainWindow выглядит так:
<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. затем вы можете использовать мощные функции шаблонов данных, чтобы просматривать элементы меню так, как вам нравится.