トップ回答者
リソースの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);
回答
-
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)
すべての返信
-
こんな感じではないでしょうか。
違っていたらすみません。
<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);
-
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)