【问题标题】:Why e.Source depends on TreeView populating method?为什么 e.Source 依赖于 TreeView 填充方法?
【发布时间】:2009-02-27 21:13:01
【问题描述】:

我有两棵树:

  1. fooTree - 由元素组成,
  2. barTree - 由
  3. 构建

两棵树都有 MouseRightButtonDown 事件,但 e.Source 类型不同:

  1. fooTree - System.Windows.Controls.TreeViewItem
  2. barTree - System.Windows.Controls.TreeView

为什么 e.Source 不同?另外,如何获取 barTree 的点击项?

标记:

    <TreeView Name="fooTree" MouseRightButtonDown="fooTree_MouseDown">
        <TreeViewItem Header="foo"></TreeViewItem>
        <TreeViewItem Header="foo"></TreeViewItem>
    </TreeView>

    <TreeView Name="barTree" MouseRightButtonDown="barTree_MouseDown" ItemsSource="{Binding BarItems}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate>
                <TextBlock Text="{Binding}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

代码:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public string[] BarItems
    {
        get { return new string[] { "bar", "bar" }; }
    }

    private void barTree_MouseDown(object sender, MouseButtonEventArgs e) 
    {
    }

    private void fooTree_MouseDown(object sender, MouseButtonEventArgs e) 
    {
    }
}

【问题讨论】:

    标签: wpf treeview event-handling


    【解决方案1】:

    不知道为什么会这样,但至少我找到了解决办法:

    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f0d3af69-6ecc-4ddb-9526-588b72d5196b/

    1. 如果您的处理程序位于 TreeView 上,请使用 事件参数并走上视觉 父链,直到你找到一个 树视图项。然后,选择它。你可以 通过使用走可视父链 System.Windows.Media.VisualTreeHelper.GetParent.

    2. 您可以尝试为 TreeViewItem 类型注册一个类处理程序和 鼠标按下事件。然后,您的处理程序 只应在鼠标时调用 事件通过 TreeViewItem 元素。

    3. 您可以为 TreeViewItem 类型和上下文注册一个类处理程序 菜单打开事件。

    所以我的代码是:

    private void OnMouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        TreeViewItem treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
    }
    
    static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
    {
        while (source != null && source.GetType() != typeof(T))
            source = VisualTreeHelper.GetParent(source);
    
        return source;
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用以下方法在 bartree 中获取点击的项目:

      ((e.Source) as TreeView).SelectedValue
      

      但请注意,必须首先实际选择该项目(使用 leftMouse)。该项目不会立即使用鼠标右键选择...

      【讨论】:

        猜你喜欢
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多