【问题标题】:WPF Double Click TreeviewItem Child NodeWPF 双击 TreeviewItem 子节点
【发布时间】:2017-01-04 19:26:26
【问题描述】:

我在一个树视图中有一个树视图项,它将绑定一个列表:

        <TreeViewItem Name="tviOffline" Foreground="Red" FontWeight="Bold"
                      Header="Offline">
            <TreeViewItem.ItemTemplate>
                <DataTemplate DataType="{x:Type local:Buddy}">
                    <StackPanel>
                        <TextBlock Text="{Binding Nick}" FontSize="10" Foreground="#8CFFD528" />
                    </StackPanel>
                </DataTemplate>
            </TreeViewItem.ItemTemplate>
        </TreeViewItem>

我不知道如何让它的每个孩子都有一个双击事件。

感谢任何帮助。非常感谢。

【问题讨论】:

    标签: wpf treeview double-click treeviewitem


    【解决方案1】:
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <EventSetter Event="MouseDoubleClick" Handler="OnItemMouseDoubleClick" />
            ...
    

    【讨论】:

    • 嗯。这比预期的要容易得多。
    【解决方案2】:
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <EventSetter Event="MouseDoubleClick" Handler="OnItemMouseDoubleClick" />
            ...
    

    然后,处理程序必须编写如下,以防止在连续的父 TreeViewItems 上触发双击:

       private void OnItemMouseDoubleClick(object sender, MouseButtonEventArgs args)
        {
            if (sender is TreeViewItem)
            {
                if (!((TreeViewItem)sender).IsSelected)
                {
                    return;
                }
            }
    
            .... do stuff.
    
        }
    

    感谢 Aurelien Ribon 完成了 90% 的工作。双击问题似乎在 Stack Exchange 上的其他帖子中众所周知。只需将两种解决方案合并为一个答案即可。

    【讨论】:

    • 谢谢 - 现在我知道如果您的事件设置在 ItemContainerStyle 上,实际上不需要在可视化树中向上搜索来查找 TreeItem。
    【解决方案3】:

    这是我设法让它适用于所有情况的唯一方法:

        void MyTreeView_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var clickedItem = TryGetClickedItem(myTreeView, e);
            if (clickedItem == null)
                return;
    
            e.Handled = true; // to cancel expanded/collapsed toggle
            DoStuff(clickedItem);
        }
    
        TreeViewItem TryGetClickedItem(TreeView treeView, MouseButtonEventArgs e)
        {
            var hit = e.OriginalSource as DependencyObject;
            while (hit != null && !(hit is TreeViewItem))
                hit = VisualTreeHelper.GetParent(hit);
    
            return hit as TreeViewItem;
        }
    

    【讨论】:

    • 更简单,而不是你的TryGetClickedItem,我只是使用hit.GetVisualParent&lt;TreeViewItem&gt;()
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多