2009-07-23 28 views
1

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); 
} 

答えて

1

使用コマンドは、ユーザーcontrolesへのアクセス権を持っているし、あなたのXAMLとバインドでアクセス可能なクラスで宣言し、ICommandのから派生したクラスを作成しますボタンを押します。詳細についてはhereを参照

0

MenuItem.Clickイベントのイベントハンドラを作成するときは、TreeViewItemにイベントハンドラを追加することもできます。

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"); 
    newTerrainNode.AddHandler(MenuItem.Click, OnTreeItemContextMenuClicked); 
    tvi.Items.Insert(0,newTerrainNode); 
} 

private void OnTreeItemContextMenuClicked(object sender, RoutedEventArgs e) 
{ 
    // Handle the ContextMenu item click here 
    // e.OriginalSource can be used to get the ContextMenu item clicked if needed. 
} 
+0

ありがとうAndy、これは私が考える正しい道に私を持っています。私は今持っています C#: newTerrainNode.ContextMenu.AddHandler(MenuItem.ClickEvent、new RoutedEventHandler(OnTreeItemContextMenuClicked)); ただし、実行時エラーが発生します。 未処理の例外:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 at TreeTest2.MainWindow.InsertTerrainNode(オブジェクト送信者、RoutedEventArgs e) 考えていますか? –

+0

イベントハンドラのどの行が例外をスローしていますか? – Andy

+0

イベントハンドラが追加されたとき - newTerrainNode.AddHandler(MenuItem.Click、OnTreeItemContextMenuClicked); TreeViewItemがその時点でツリーに挿入されていないためだと思っていましたが、tvi.Items.Insertの後にハンドラを追加すると、同じコード行で同じエラーが発生します(0、 newTerrainMode); –

関連する問題