WPF有一个相当有趣的问题。我有一个树状视图,到目前为止选择项目还不错。问题是,当用户在树视图的空白区域内单击时,我想取消选择当前选定的项目。默认情况下,treeview保持当前项目处于选中状态,并且我添加了一个上下文菜单选项以取消选择它,这是相当困难的:
// 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;
而且,这是违反直觉的,因为它要求用户首先右键单击,然后第二次,以这种方式取消选择后,用户无法再通过单击项目来选择它。这应该如何工作?
编辑:更多信息:我已经向
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");
}
}
XAML为此:
<TreeView x:Name="MyTreeView" Margin="3" MouseUp="MyTreeView_MouseUp">
最佳答案
我发现这对我来说更好。我检查原始资源,对于我来说,如果它来自一个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;
}
}
}
关于wpf - 单击某些空白区域时,如何取消选择WPF TreeView 中的所有选定项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/491111/