我对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)
我发现这对我来说效果更好.我查看原始资源,如果它来自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)
如果没有单击,这将取消选择当前选定的 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)
希望这就是您正在寻找的!