如何在单击某个空白区域时取消选择WPF树视图中的所有选定项目?

Ant*_*eru 9 wpf

我对WPF有一个相当有趣的问题.我有一个树视图,到目前为止选择项目工作正常.问题是,当用户在树视图的空白区域内单击时,我想取消选择当前选定的项目.默认情况下,树视图保持选中当前项目,并且我添加了一个上下文菜单选项以取消选择它,这是相当硬的:

// Note: This is done recursivly from the start, so it
// works for child items as well
treeView.ItemContainerGenerator.ContainerFromItem(treeView.SelectedItem) as TreeViewItem).IsSelected = false;
Run Code Online (Sandbox Code Playgroud)

此外,这是违反直觉的,因为它要求用户首先右键单击,其次,在用这种方式取消选择之后,用户不能再通过单击该项目来选择它.这应该怎么样?

编辑:更多信息:我已经TreeView为处理鼠标点击事件添加了处理程序,但发件人始终是一个TreeView实例,即使我直接点击一个TreeViewItem.如果我向我添加一个处理程序TreeView.ItemTemplate(即模板中的第一个子节点),当我点击空白区域时,我从未得到事件(这是相当合乎逻辑的).代码如下所示:

    private void MyTreeView_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        if ((sender as TreeViewItem) == null)
        {
            // Always triggered
            System.Diagnostics.Trace.Write("Empty area clicked");
        }
    } 
Run Code Online (Sandbox Code Playgroud)

而XAML就是:

<TreeView x:Name="MyTreeView" Margin="3" MouseUp="MyTreeView_MouseUp">
Run Code Online (Sandbox Code Playgroud)

Eri*_*rin 6

我发现这对我来说效果更好.我查看原始资源,如果它来自treeviewitem,它将是一个图像或文本块.我还使用带有HierarchicalDataTemplate的视图对象,而BasicTreeViewBase是我所有不同对象的基类.这是代码.

private void TemplateTreeView_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ChangedButton == MouseButton.Right && !(e.OriginalSource is Image) && !(e.OriginalSource is TextBlock))
        {
            BasicTreeViewBase item = TemplateTreeView.SelectedItem as BasicTreeViewBase;
            if (item != null)
            {
                TemplateTreeView.Focus();
                item.IsSelected = false;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Rob*_*nee 5

在设置TreeViewItem.IsSelected后,可以通过调用FocusView在TreeView上解决不可选择的问题.


Mar*_*ter 0

如果没有单击,这将取消选择当前选定的 TreeViewItem:

private void MyTreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e) {
    if ((sender as TreeViewItem) == null) {
        TreeViewItem item = MyTreeView.SelectedItem as TreeViewItem;
        if(item != null){
            item.IsSelected = false;                    
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这就是您正在寻找的!