2010-05-31 90 views
0

我有很多MenuItem,並且希望能夠更改它們的「內容」,以便它在程序中顯示。當我加載程序時,他們的「Content Name」被設置在我創建的Setter中..但唯一的問題是我有近百個MenuItem對象,並且我需要它們在程序中的顯示名稱不同(不是setter的默認值)。我可以創建超過100個不同的「Setter」,並在其中更改一行。但這非常耗時。有一個更簡單的方法嗎?我希望能夠在我聲明它們的XAML中執行此操作。有沒有辦法做到這一點?我一直在尋找和嘗試不同的嘗試,但目前爲止沒有......也許有人知道?WPF MenuItem內容「名稱」

編輯:

對不起,也許我是有點不清楚..

我已經創建了的MenuItems,他們是基於我創建了二傳手...問題是...我現在希望每個人都仍然基於那個Setter,但是要爲用戶顯示一個獨特的「內容」/名稱......目前,他們都具有由制定者給予他們的「內容」名稱,但是我正在尋找通過XAML設置每個MenuItem的內容名稱的方法..這可能嗎?

謝謝

回答

0

你的問題不清楚。我認爲創建數百個菜單項的最佳方式是從不在XAML中的代碼創建它們。例如在一個foreach循環中。那麼你可以給他們每個人一個獨特而有意義的名字。請更清楚地描述你的問題。

謝謝

+0

對不起,也許我有點不清楚.. 我已經創建了MenuItems,它們是基於我創建的Setter ...問題是..我現在想要每個人仍然基於但是要爲用戶顯示唯一的「內容」/名稱......目前,它們都具有由設置者給予它們的「內容」名稱,但我正在尋找一種方法來設置每個MenuItem的內容名稱通過XAML ..這是可能的嗎? – Kyle 2010-05-31 17:58:45

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號的菜單項,然後我們將它們綁定到的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> 

在這種計算策略,你可以先創建所有的菜單項和他們的名字在代碼和其綁定到菜單對象之後。那麼您可以使用樣式來設置菜單項的通用屬性。

但更好的解決方案是使用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代碼是這樣的:

<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文件或從其他數據源檢索FOT \ r例如你的菜單項的名稱和他們沒有硬編碼到你的XAML文件。那麼您可以使用DataTemplates的強大功能以您喜歡的方式查看菜單項。