我有一个具有2级层次结构的TreeView控件。如果选择了第二级的项目,并且用户单击了另一个项目,我需要询问他是否确定要移动到另一个项目。如果他的答案是“否”,我需要阻止选择另一个TreeViewItem。
我试着这样做:
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="PreviewKeyDown" Handler="TreeViewItem_OnKeyDown" />
</Style>
</TreeView.Resources>
private void TreeViewItem_OnMouseDown(object sender, MouseButtonEventArgs e)
{
var selectedTreeViewItem = sender as TreeViewItem;
if (selectedTreeViewItem != null)
{
var myData = selectedTreeViewItem.Header as MyData;
if (myData != null && selectedNode != null)
{
if (!selectedNode.DoYouAgreeToMoveToAnotherItem())
{
e.Handled = true;
}
else
{
myTreeView.Focus();
myData.IsNodeSelected = true;
}
}
}
}
以一种有效的方式。但是,问题是我得到了两次OnMouseDown事件:第一级项目和第二级项目。例如,对于这棵树:俄罗斯-莫斯科-皮特美国-纽约-波士顿如果我单击波士顿,我将获得美国的第一个事件,然后是波士顿的事件。所以,我无法区分案件:
TreeViewItem_OnMouseDown我需要知道用户点击的TreeViewItem。
你能告诉我,我如何确定用户在TreeViewItem_OnMouseDown中点击的树视图?再次,如果我只是检查一个发送者。可能是美国,但实际上用户点击了波士顿。所以我需要意识到那是波士顿。
这只是一个粗略的示例,但您可以从代码隐藏中处理类似的内容。
XAML
<TreeView ...>
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="treeViewItem_PreviewMouseLeftButtonDown" />
</Style>
</TreeView.Resources>
...
</TreeView>
一些帮助方法
public static T GetFirstAncestorOfType<T>(DependencyObject source) where T : class
{
while (source != null && !(source is T))
source = VisualTreeHelper.GetParent(source);
return source as T;
}
public static MessageBoxResult DoYouAgreeToMoveToAnotherItem()
{
return MessageBox.Show("Select a different item?", "Select?", MessageBoxButton.YesNo);
}
代码隐藏
private TreeViewItem _selectedItem = null;
void treeViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
TreeViewItem tvi = GetFirstAncestorOfType<TreeViewItem>(e.OriginalSource as DependencyObject);
if (_selectedItem != null &&
tvi != null &&
tvi != _selectedItem &&
MessageBoxResult.Yes != DoYouAgreeToMoveToAnotherItem())
{
e.Handled = true;
}
else
{
// Update _selectedItem for comparison the next time this method fires.
_selectedItem = tvi;
if(_selectedItem != null)
_selectedItem.IsSelected = true;
}
}
您也可以使用纯MVVM来实现这一点。我没有时间发布使用TreeView
的示例,但是解决方案可能涉及使用Dispatcher
类似于这里提供的解决方案...
WPF:取消数据库列表框中的用户选择?
我正在使用()。有一些树节点,必须禁用这些节点才能进行选择。我试过选择活动,但它不起作用。更多信息请找到下面的代码。 如何阻止某些进行任何鼠标和键盘选择?
我想使树状视图与可编辑的节点。我在谷歌上搜索了这篇好文章: http://www.codeproject.com/Articles/31592/Editable-TextBlock-in-WPF-for-In-place-Editing 但是我有一个问题。我的TreeView形成了dinamally,而不是静态的角质层。就像那样 DocPackageExtendedList的列表。 所以,第一个问
我创建了一个名为的简单库,其中有两个类。第一个是称为的Hilt模块 第二个是一个简单的类。 现在我想在我的一个应用程序中使用。所以我在应用程序中添加了依赖项。 所以我的问题是 为什么库模块的依赖项进入应用程序模块,而不使用的? 如何告诉Hilt“不要在外部库(gradle依赖项)中查找@provides?”除非我用标记模块
问题内容: 我发现经典的Java Deadlock Tutorial 中包含对System.out.format的调用将防止死锁的发生,我不知道为什么。 下面的代码是相同的教程,与除的 这是输出: 删除违规行会导致通常的死锁: 对System.out.format的调用是否以某种方式改变了线程获取对象内在锁的方式? 更新: 通过更改代码中启动线程的位置,我能够使系统再次陷入僵局: 这就引出了一个问
问题内容: 我的侧边栏中有一个使用嵌套列表( 和 标记)的分层导航菜单。我使用的预制主题已经具有列表项的样式,但是我想更改顶级项的样式,但不能将其应用于子项。是否有一种简单的方法可以将样式应用于顶级列表项标签,而无需将样式层叠到其子级列表项?我知道我可以在子项目中显式添加重写样式,但是如果有一种简单的方法,只是说“将这些样式应用于此类并且不要级联,我真的很想避免必须重复所有样式代码”他们将其归
本文向大家介绍如何防止XSS攻击?相关面试题,主要包含被问及如何防止XSS攻击?时的应答技巧和注意事项,需要的朋友参考一下 (1) 将前端输出数据都进行转义 (2) 将输出的字符串中的\反斜杠进行转义 (3) 从url中获取的信息,防止方法是由后端获取,在前端转义后再行输出 (4) 使用cookie的HttpOnly属性,保护好cookie 详细参见:http://blog.csdn.net/fe