none
リソースのContextMenuにC#コードから項目を追加したい

    質問

  • Xamlの"Window.Resources"にあるContextMenuに、C#コードから動的に項目を追加したいのですが、どうすればいいのでしょうか?

    下のコードを書いてみましたがうまく動きませんでした

        <Window.Resources>
            <ContextMenu>
                <MenuItem x:Name="mi" Header="Test"/>
            </ContextMenu>
        </Window.Resources>

    -----------------------------------------------------------------

         var test = (MenuItem)FindResource("mi");
         MenuItem menuItem= new MenuItem();
         menuItem.Header = "Test1";
         test.Items.Add(menuItem);

    2019年2月19日 3:55

回答

  • FindResourcesで名前検索できないようなので、かっこ悪いですが以下のような感じでしょうか。

    ※cm.getNameで取れればいいのですが、できないようです。。。

                var cm = (ContextMenu)FindResource("TestCM");
                MenuItem test = null;
                foreach (FrameworkElement elm in cm.Items)
                {
                    if (elm.Name == "mi")
                    {
                        test = (MenuItem)elm;
                        break;
                    }
                }

                if (test != null)
                {
                    MenuItem menuItem = new MenuItem();
                    menuItem.Header = "Test1";
                    test.Items.Add(menuItem);
                }

    [追記]

    以下で取れそうです。

                var cm = (ContextMenu)FindResource("TestCM");
                MenuItem test = (MenuItem)LogicalTreeHelper.FindLogicalNode(cm, "mi");

                MenuItem menuItem = new MenuItem();
                menuItem.Header = "Test1";
                test.Items.Add(menuItem)

    • 編集済み yama san 2019年2月19日 6:53
    • 回答の候補に設定 WPF開発 2019年2月19日 7:09
    • 回答の候補の設定解除 WPF開発 2019年2月19日 7:09
    • 回答としてマーク ttkk_737 2019年2月19日 7:09
    2019年2月19日 6:05

すべての返信

  • こんな感じではないでしょうか。

    違っていたらすみません。

    <Window.Resources>
        <ContextMenu x:Key="TestCM"> ←キー名指定追加
            <MenuItem x:Name="mi" Header="Test"/>
        </ContextMenu>
    </Window.Resources>

    -----------------------------------------------------------------

    var test = (ContextMenu)FindResource("TestCM"); ←MenuItemではなく、ContextMenuを取得する
    MenuItem menuItem= new MenuItem();
    menuItem.Header = "Test1";
    test.Items.Add(menuItem);

    2019年2月19日 4:44
  • ありがとうございます。

    すいません…説明不足でした…

    MenuItem(mi)に追加したいです。

    Xamlで書くと、このような感じのをC#で作りたいです。

        <Window.Resources>
            <ContextMenu>
                <MenuItem x:Name="mi" Header="Test">
                    <MenuItem Header="Test1">
                </MenuItem>
            </ContextMenu>
        </Window.Resources>

    2019年2月19日 5:30
  • FindResourcesで名前検索できないようなので、かっこ悪いですが以下のような感じでしょうか。

    ※cm.getNameで取れればいいのですが、できないようです。。。

                var cm = (ContextMenu)FindResource("TestCM");
                MenuItem test = null;
                foreach (FrameworkElement elm in cm.Items)
                {
                    if (elm.Name == "mi")
                    {
                        test = (MenuItem)elm;
                        break;
                    }
                }

                if (test != null)
                {
                    MenuItem menuItem = new MenuItem();
                    menuItem.Header = "Test1";
                    test.Items.Add(menuItem);
                }

    [追記]

    以下で取れそうです。

                var cm = (ContextMenu)FindResource("TestCM");
                MenuItem test = (MenuItem)LogicalTreeHelper.FindLogicalNode(cm, "mi");

                MenuItem menuItem = new MenuItem();
                menuItem.Header = "Test1";
                test.Items.Add(menuItem)

    • 編集済み yama san 2019年2月19日 6:53
    • 回答の候補に設定 WPF開発 2019年2月19日 7:09
    • 回答の候補の設定解除 WPF開発 2019年2月19日 7:09
    • 回答としてマーク ttkk_737 2019年2月19日 7:09
    2019年2月19日 6:05
  • できました!ありがとうございます!
    2019年2月19日 7:09