2017-03-09 23 views
0

事前定義<Menu>WPF動的メニューアイテム

XAMLに動的一部MenuItemsを追加しようとする:

<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

私は新しいプロジェクトを作成し、コードをテストしました。それはうまく動作します!あなたのmainwindow.xamlで

+0

完全な最低限の例PLZを作成します。 – Steve

+0

がポストを更新しました。 –

+1

コードはコンパイルされませんが、修正するとうまく動作します。 – vesan

答えて

0

、あなたはこれに似た何かを持っていることができます...

<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を作成する必要があります。私たちのケースでは、複数の異なるメニューアイテムを持つコレクションとしてMenuItemを持っています。次に、xamlでは、MenuItemのobservablecollectionにバインドできます。この方法では、xamlの中にを明示的に宣言する必要はありません。なぜなら、それらはすでに問題ではなかったobservablecollections MenuItems – user7583356

1

あなたはすべてのことを正しく行いました。それはあなたのMenuItem mItem1を宣言しているだけですが、それを使用すると、2番目のものと同じものを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

の中にあるからです。それは間違いのコピーと貼り付けでした。 –

関連する問題