【问题标题】:How do I make the TreeViewItem(s) of an existing TreeView raise a Click event?如何使现有 TreeView 的 TreeViewItem(s) 引发 Click 事件?
【发布时间】:2023-03-30 03:16:01
【问题描述】:

如何使现有 WPF TreeView 的 TreeViewItem(s) 引发 Click 事件?

目前,我们正在处理 SelectedItemChanged。在我们的例子中,我们正在显示对话框,因此用户可以多次单击同一个选定的 TreeViewItem。

【问题讨论】:

  • 单击 MouseLeftButtonUp 而不是 MouseLeftButtonDown。

标签: wpf treeview


【解决方案1】:

工作示例

<Window x:Class="MenuExperiment1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow">
    <TreeView Name="treeView1"
              Height="320"
              Width="200">
        <TreeView.Resources>
            <Style TargetType="TreeViewItem">
                <EventSetter Event="MouseLeftButtonUp"
                             Handler="treeViewItem_MouseLeftButtonUp" />
                <EventSetter Event="KeyUp"
                             Handler="treeViewItem_KeyUp" />
            </Style>
        </TreeView.Resources>
        <TreeViewItem  Header="aa" />
        <TreeViewItem  Header="bb">
            <TreeViewItem Header="b1"></TreeViewItem>
            <TreeViewItem Header="b2"></TreeViewItem>
        </TreeViewItem>
        <TreeViewItem  Header="cc">
            <TreeViewItem Header="c1">
                <TreeViewItem Header="c1a"></TreeViewItem>
                <TreeViewItem Header="c1b"></TreeViewItem>
            </TreeViewItem>
            <TreeViewItem Header="c2"></TreeViewItem>
        </TreeViewItem>
        <TreeViewItem  Header="dd" />
    </TreeView>
</Window>

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Diagnostics;

namespace MenuExperiment1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void treeViewItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Handler(sender,e);
        }

        private void treeViewItem_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                Handler(sender, e);
            }
        }

        private void Handler(object sender, InputEventArgs e)
        {
            e.Handled = true;
            Debug.Write(((TreeViewItem)sender).Header);
            Debug.WriteLine(" clicked");
        }
    }
}

【讨论】:

    【解决方案2】:

    您是否尝试过使用 MouseLeftButtonUp 事件?您应该能够通过挂钩该事件来实现与实际单击事件相同的用户体验。

    PreviewMouseLeftButtonDownMouseLeftButtonDown 也可能适用于您,具体取决于 TreeViewItem 的布局(例如使用包含 TextBlock 的内容模板)。

    【讨论】:

      【解决方案3】:

      您可以在ItemContainerStyleTreeView 中使用事件设置器:

            <TreeView.ItemContainerStyle>
                  <Style TargetType="TreeViewItem">
                      <EventSetter Event="PreviewMouseLeftButtonDown" Handler="TreeViewItem_MouseLeftButtonDown" />
                  </Style>
            </TreeView.ItemContainerStyle>
      

      【讨论】:

      • 使用ItemContainerStyle 不适用于子项。转移到资源工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多