TreeViewコントロールにTreeViewItemを挿入し、挿入時にそれぞれのスタイルを設定します。挿入するノード(TreeViewItem)のタイプに応じて、異なるスタイル(XAMLで事前定義されている)を割り当てています。スタイルの中には、ContextMenuがあります。TreeView ContextMenuからMenuItemのクリックイベントを取得する方法
私の問題は、MenuItemsでClick = "MyHandler"を使用できないことです。 XAMLファイルのイベントハンドラをサポートするために、ルート要素にx:Class属性が必要です」というエラーが表示される明らかにStyleブロック内のどの要素もルート要素ではありません。
ご迷惑をおかけして申し訳ございません。
XAML:
<Style x:Key="Terrain" TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Canvas Background="{DynamicResource Terrain_icon}" />
<TextBlock Text="{Binding}" />
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit..." Click="MyHandler"/> <!-- Error -->
<MenuItem Header="Add..."/>
<MenuItem Header="Delete"/>
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
のC#:
private void InsertTerrainNode(object sender, System.Windows.RoutedEventArgs e)
{
// Add the new item under the first-level TreeViewItem
TreeViewItem tvi = myTree.ItemContainerGenerator.ContainerFromItem(myTree.Items[0]) as TreeViewItem;
TreeViewItem newTerrainNode = new TreeViewItem();
newTerrainNode.Header = "Terrain";
newTerrainNode.Style = (Style)this.FindResource("Terrain");
tvi.Items.Insert(0,newTerrainNode);
}
ありがとうAndy、これは私が考える正しい道に私を持っています。私は今持っています C#: newTerrainNode.ContextMenu.AddHandler(MenuItem.ClickEvent、new RoutedEventHandler(OnTreeItemContextMenuClicked)); ただし、実行時エラーが発生します。 未処理の例外:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 at TreeTest2.MainWindow.InsertTerrainNode(オブジェクト送信者、RoutedEventArgs e) 考えていますか? –
イベントハンドラのどの行が例外をスローしていますか? – Andy
イベントハンドラが追加されたとき - newTerrainNode.AddHandler(MenuItem.Click、OnTreeItemContextMenuClicked); TreeViewItemがその時点でツリーに挿入されていないためだと思っていましたが、tvi.Items.Insertの後にハンドラを追加すると、同じコード行で同じエラーが発生します(0、 newTerrainMode); –