如何从 TreeView ContextMenu 获取 MenuItem 单击事件

发布于 2024-07-27 14:18:26 字数 1664 浏览 3 评论 0原文

我将 TreeViewItems 插入到 TreeView 控件中,并在插入时设置每个项目的样式。 我根据要插入的节点 (TreeViewItem) 的类型分配不同的样式(在 XAML 中预定义)。 一些样式包括上下文菜单。

我的问题是我无法在 MenuItems 上使用 Click="MyHandler"; 我收到错误“根元素需要 ax:Class 属性来支持 XAML 文件中的事件处理程序。” 显然 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);
}

I am inserting TreeViewItems into a TreeView control and setting the style for each at the time of insertion. I am assigning different styles (predefined in XAML), depending on the type of node (TreeViewItem) I want to insert. Some of the styles include a ContextMenu.

My problem is that I am unable to use Click="MyHandler" on the MenuItems; I get an error "root element requires a x:Class attribute to support event handlers in the XAML file." and apparently none of the elements within the Style block are root elements.

Any suggestions much appreciated.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

轻拂→两袖风尘 2024-08-03 14:18:26

使用命令,创建一个从 ICommand 派生的类,在该类中声明可以访问用户控件并且可以在 xaml 中访问并使用该命令绑定按钮。 请参阅此处 详细信息

Use commands, create a class derived from ICommand, declare in the class that have access to user controles and is accessible in your xaml and bind button with that command. see here for detailes

分分钟 2024-08-03 14:18:26

另一种选择是在创建 TreeViewItem 时将 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.
}

Another option is to add an event handler for the MenuItem.Click event to the TreeViewItem as you create it.

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.
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文