2017-03-09 149 views
0

試圖動態地添加一些MenuItems到預先定義的<Menu>WPF動態的菜單項

XAML

<Window x:Class="FSBEM.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:FSBEM" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:src="clr-namespace:FSBEM.Models" 
    mc:Ignorable="d" 
    Title="BEM" Height="471.997" Width="1186.374" 
    WindowStartupLocation="CenterScreen" 
    WindowState="Maximized" 
    Closing="Window_Closing" 
    Icon="/Media/Icons/AppL.ico"> 

    <Grid Name="MainGrid" FlowDirection="LeftToRight"> 
     <Menu Name="MainMenu" HorizontalAlignment="Stretch" Height="23 VerticalAlignment="Top" > 
     <MenuItem Name="M_1" Header="1"> 
       <MenuItem Name="M_2" Header="2"/> 
       <MenuItem Name="M_3" Header="3" /> 
     </MenuItem> 
     <MenuItem Name="M_Test" Header="Test"/> 
     </Menu> 
    </Grid> 
</Window> 

Code-Behind

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

     MenuItem mItem1 = new MenuItem(); 
     mItem1.Name = "MenuItem1"; 
     mItem1.Header = "MenuItem1"; 
     M_Test.Items.Add(mItem1); 

     MenuItem mItem2 = new MenuItem(); 
     mItem2.Name = "MenuItem2"; 
     mItem2.Header = "MenuItem2"; 
     M_Test.Items.Add(mItem2); 
    } 
} 

和下面是結果:

enter image description here

我不知道問題是什麼。任何幫助!

UPDATE

代碼編譯罰款,給我的結果上面的圖片。

Note

我創建了一個新的項目和測試代碼。它工作正常!

+0

創建一個完整的最小例子PLZ。 – Steve

+0

更新了帖子。 –

+1

您的代碼不能編譯,但在修復時效果不錯。 – vesan

回答

0

在你mainwindow.xaml,你可以有類似這樣的東西...

<Window x:Class="WpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Name="mainwindow"> 
    <Window.Resources> 
     <CollectionViewSource Source="{Binding ElementName=mainwindow, Path=Windows}" x:Key="YourMenuItems"/> 
    </Window.Resources> 

    <Grid DataContext="{Binding ElementName=mainwindow}"> 
     <Menu Height="24" VerticalAlignment="Top"> 
     <MenuItem Header="_View" > 
       <MenuItem Header="Windows"> 
        <MenuItem.ItemsSource> 
         <CompositeCollection> 
          <CollectionContainer Collection="{Binding Source={StaticResource MenuItems}}" />        
         </CompositeCollection> 
        </MenuItem.ItemsSource> 
        <MenuItem.ItemContainerStyle> 
         <Style> 
          <Setter Property="MenuItem.Header" Value="{Binding MenuItemName}"/> 
         </Style> 
        </MenuItem.ItemContainerStyle> 
       </MenuItem> 
      </MenuItem> 
     </Menu> 
    </Grid> 
</Window> 

然後在mainwindow.xaml.cs,你可以有這樣的事情...

public partial class MainWindow : Window 
{ 
    private ObservableCollection<MenuItem> _menuItems= new ObservableCollection<YourObj>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     MenuItems.Add(new MenuItem{ Title = "Menu Item 1" }); 
     MenuItems.Add(new MenuItem{ Title = "Menu Item 2" }); 
    } 

    public ObservableCollection<MenuItem> MenuItems 
    { 
     get { return _menuItems; } 
     set { _menuItems= value; } 
    } 
} 

public class YourObj 
{ 
    public string MenuItemName{ get; set; } 
} 
+0

你應該解釋這是如何和爲什麼這個工程。 –

+0

我的道歉,首先,在你的mainwindow.xaml.cs中,你應該創建一個有多個不同菜單項的observablecollection;在我們的例子中,我們有MenuItems作爲具有多個不同菜單項的集合。然後在xaml中,我們可以綁定到MenuItems的observable集合。這樣,你就不需要在xaml中顯式聲明>多次,因爲它們已經在observablecollections MenuItems – user7583356

1

你所做的一切都是正確的,只是你聲明瞭你的MenuItem mItem1,但是在使用它的時候,你正在寫mItem(最後你忘記了1)和第二個一樣。

這是代碼應如何:

   MenuItem mItem1 = new MenuItem(); 
      mItem1.Name = "MenuItem1"; 
      mItem1.Header = "MenuItem1"; 
      M_Test.Items.Add(mItem1); 

      MenuItem mItem2 = new MenuItem(); 
      mItem2.Name = "MenuItem2"; 
      mItem2.Header = "MenuItem2"; 
      M_Test.Items.Add(mItem2); 
+0

之內了,這不是問題。這是一個錯誤的複製和粘貼。 –