如何将 C# 上的 MouseDoubleClick 事件添加到 TreeViewItem
How to add a MouseDoubleClick event on C# to a TreeViewItem
我是 WPF 和 C# 编程的新手。
我正在尝试通过代码创建一个 TreeView 以从我的数据库中添加数据。数据分为两部分:
- 客户姓名
- 一些日期
对我来说,数据的第一部分是主 TreeViewItem,第二部分,即日期,挂在 TreeView 的第一部分。
所有数据都以字符串形式形成。
我以这种方式将它们添加到我的 TreeView 中:
// Adding new client to TreeView
TreeViewItem item = new TreeViewItem();
item.Header = entry.Key;
item.ItemsSource = entry.Value.ToArray(); // Adding also the dates
item.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Here is the problem
try
{
Arbol_Clientes.Items.Add(item);
}
catch( Exception error)
{
Console.WriteLine("ERROR: " + error.ToString());
}
问题是,当我点击 TreeView 的日期时,事件是由客户端名称调用的,例如:
当我双击红色日期时,事件获取蓝色 TreeViewItem 作为调用处理程序的事件,在处理程序代码中,hijo 是 "ABM"
而不是 "/2019 0:00:00"
:
处理程序代码:
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs {
var hijo = sender as TreeViewItem;
ItemsControl parent = GetSelectedTreeViewItemParent(hijo);
TreeViewItem treeitem = parent as TreeViewItem;
string Nombre_Cliente = treeitem.Header.ToString();
Etiqueta.Content = Nombre_Cliente + " " + hijo.Header.ToString();
}
我想通过所有这些实现的最终结果是这样的xaml:
<TreeView Grid.Column="0" BorderThickness="0" x:Name="Arbol_Clientes">
<TreeViewItem Header="ABM" IsExpanded="True">
<TreeViewItem Header="Enero 2019" MouseDoubleClick="TreeViewItem_MouseDoubleClick"/>
<TreeViewItem Header="Febrero 2019" MouseDoubleClick="TreeViewItem_MouseDoubleClick"/>
</TreeViewItem>
<TreeViewItem Header="VCF" IsExpanded="True">
<TreeViewItem Header="Enero 2019" MouseDoubleClick="TreeViewItem_MouseDoubleClick"/>
</TreeViewItem>
</TreeView>
item.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Here is the problem
您没有收到日期项目的事件,因为您没有订阅这些项目。只有顶级节点才附加事件。您需要订阅子项上的事件
请尝试以下操作:
// Adding new client to TreeView
TreeViewItem item = new TreeViewItem();
item.Header = entry.Key;
foreach (var date in entry.Value.ToArray())
{
var child = new TreeViewItem();
child.Header = date;
child.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Only subscribe to the child
item.Items.Add(child);
}
try
{
Arbol_Clientes.Items.Add(item);
}
catch (Exception error)
{
Console.WriteLine("ERROR: " + error.ToString());
}
您可以使用 VisualTreeHelper
class:
获取对单击元素 (e.OriginalSource
) 的父 TreeViewItem
的引用
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var hijo = FindParent<TreeViewItem>(e.OriginalSource as DependencyObject);
//...
}
private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
var parent = VisualTreeHelper.GetParent(dependencyObject);
if (parent == null) return null;
var parentT = parent as T;
return parentT ?? FindParent<T>(parent);
}
我是 WPF 和 C# 编程的新手。
我正在尝试通过代码创建一个 TreeView 以从我的数据库中添加数据。数据分为两部分:
- 客户姓名
- 一些日期
对我来说,数据的第一部分是主 TreeViewItem,第二部分,即日期,挂在 TreeView 的第一部分。 所有数据都以字符串形式形成。
我以这种方式将它们添加到我的 TreeView 中:
// Adding new client to TreeView
TreeViewItem item = new TreeViewItem();
item.Header = entry.Key;
item.ItemsSource = entry.Value.ToArray(); // Adding also the dates
item.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Here is the problem
try
{
Arbol_Clientes.Items.Add(item);
}
catch( Exception error)
{
Console.WriteLine("ERROR: " + error.ToString());
}
问题是,当我点击 TreeView 的日期时,事件是由客户端名称调用的,例如:
当我双击红色日期时,事件获取蓝色 TreeViewItem 作为调用处理程序的事件,在处理程序代码中,hijo 是 "ABM"
而不是 "/2019 0:00:00"
:
处理程序代码:
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs {
var hijo = sender as TreeViewItem;
ItemsControl parent = GetSelectedTreeViewItemParent(hijo);
TreeViewItem treeitem = parent as TreeViewItem;
string Nombre_Cliente = treeitem.Header.ToString();
Etiqueta.Content = Nombre_Cliente + " " + hijo.Header.ToString();
}
我想通过所有这些实现的最终结果是这样的xaml:
<TreeView Grid.Column="0" BorderThickness="0" x:Name="Arbol_Clientes">
<TreeViewItem Header="ABM" IsExpanded="True">
<TreeViewItem Header="Enero 2019" MouseDoubleClick="TreeViewItem_MouseDoubleClick"/>
<TreeViewItem Header="Febrero 2019" MouseDoubleClick="TreeViewItem_MouseDoubleClick"/>
</TreeViewItem>
<TreeViewItem Header="VCF" IsExpanded="True">
<TreeViewItem Header="Enero 2019" MouseDoubleClick="TreeViewItem_MouseDoubleClick"/>
</TreeViewItem>
</TreeView>
item.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Here is the problem
您没有收到日期项目的事件,因为您没有订阅这些项目。只有顶级节点才附加事件。您需要订阅子项上的事件
请尝试以下操作:
// Adding new client to TreeView
TreeViewItem item = new TreeViewItem();
item.Header = entry.Key;
foreach (var date in entry.Value.ToArray())
{
var child = new TreeViewItem();
child.Header = date;
child.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Only subscribe to the child
item.Items.Add(child);
}
try
{
Arbol_Clientes.Items.Add(item);
}
catch (Exception error)
{
Console.WriteLine("ERROR: " + error.ToString());
}
您可以使用 VisualTreeHelper
class:
e.OriginalSource
) 的父 TreeViewItem
的引用
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var hijo = FindParent<TreeViewItem>(e.OriginalSource as DependencyObject);
//...
}
private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
var parent = VisualTreeHelper.GetParent(dependencyObject);
if (parent == null) return null;
var parentT = parent as T;
return parentT ?? FindParent<T>(parent);
}