C# 如何将数据传递到RoutedEventHandler函数中
我正在开发一个利用WPF的C#应用程序,目前正在寻找在TreeViewItem对象接收焦点时触发事件的方法。我用以下代码以非常基本的方式实现了这一点: 分配事件:C# 如何将数据传递到RoutedEventHandler函数中,c#,wpf,routed-events,C#,Wpf,Routed Events,我正在开发一个利用WPF的C#应用程序,目前正在寻找在TreeViewItem对象接收焦点时触发事件的方法。我用以下代码以非常基本的方式实现了这一点: 分配事件: TreeViewItem chr = new TreeViewItem(); chr.GotFocus += new RoutedEventHandler(testing); 实际处理程序: private void testing(object o, RoutedEventArgs e) { MessageBox.Sho
TreeViewItem chr = new TreeViewItem();
chr.GotFocus += new RoutedEventHandler(testing);
实际处理程序:
private void testing(object o, RoutedEventArgs e)
{
MessageBox.Show("TESTING");
}
这很简单,但我也希望能够使用eventhandler方法中对象的数据。大致如下:
TreeViewItem chr = new TreeViewItem();
chr.GotFocus += new RoutedEventHandler(testing(chr));
我不太明白怎么做,我做的任何事情都会导致语法错误。这通常是如何做到的/甚至可能吗
非常感谢您的帮助。您应该使用SelectedItemChanged事件。检查下一个示例:
private void SomeFunction()
{
TreeViewItem chr = new TreeViewItem();
chr.GotFocus += testing; // Event directly, no wrapper.
}
private void testing(object sender, RoutedEventArgs e) // it's RoutedEventArgs, not EventArgs
{
var chr = sender as TreeViewItem; // convert to item
//do your rest work
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
tree.SelectedItemChanged += Tree_SelectedItemChanged;
}
private void Tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
MessageBox.Show(((TreeViewItem)e.NewValue).Header.ToString());
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
tree.SelectedItemChanged+=tree\u SelectedItemChanged;
}
私有无效树\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
Show(((TreeViewItem)e.NewValue.Header.ToString());
}
}
该方法将在e参数的“NewValue”属性中接收TreeViewItem,因此,MessageBox将显示项标签 您应该使用SelectedItemChanged事件。检查下一个示例:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
tree.SelectedItemChanged += Tree_SelectedItemChanged;
}
private void Tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
MessageBox.Show(((TreeViewItem)e.NewValue).Header.ToString());
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
tree.SelectedItemChanged+=tree\u SelectedItemChanged;
}
私有无效树\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
Show(((TreeViewItem)e.NewValue.Header.ToString());
}
}
该方法将在e参数的“NewValue”属性中接收TreeViewItem,因此,MessageBox将显示项标签 使用
sender
参数,如下所示:
private void testing(object o, EventArgs e)
{
var treeViewItem = o as TreeViewItem;
}
如果发送者对象实际上是触发事件的对象,则针对您的案例使用
发送者参数,如下所示:
private void testing(object o, EventArgs e)
{
var treeViewItem = o as TreeViewItem;
}
碰巧发送方对象实际上是触发事件的对象,您的案例中的TreeViewItem这一个看起来非常有希望。这会创建原始的深度副本还是浅层副本?我用的是午休自动取款机,所以我回来后会把所有这些都拿出来,告诉你结果。这不会产生任何效果。这是相同的参考。它实际上与您试图作为参数传递的chr
相同。这个看起来非常有希望。这会创建原始的深度副本还是浅层副本?我用的是午休自动取款机,所以我回来后会把所有这些都拿出来,告诉你结果。这不会产生任何效果。这是相同的参考。它实际上与您试图作为参数传递的chr
相同。这看起来是执行类似操作的正确形式。此更改是在新选定的项目上触发,还是在以前选定的元素上触发?此更改是在新选定的项目上触发。这看起来是执行类似操作的正确形式。此更改是在新选定的项目上触发,还是在以前选定的元素上触发?此更改是在新选定的项目上触发。感谢您更正上次尝试的事件参数。这看起来也像是我试图实现的。@HowardP我没有看到你选择的答案有什么大的不同。我提供了足够的注释来理解,而答案的事件arg不正确,应该是RoutedEventArgs
:)塔奎恩的回答也给了我一些帮助我理解的解释。你的回答也很好,很遗憾,我不能同时接受这两个答案。我的道歉@Dongdong,我只是写了我的答案,没有看到你真诚的回答。虽然我不同意你关于EventArgs
的评论,但这是不正确的。因为我看到OP使用的是派生较少的类型,所以我也这样做了。。。语言允许这样做。。。试试你自己。。第二个参数甚至可以是object
@taquion类型的。不用担心,我们只需将其更正即可@HowardP,他的代码的问题不仅仅是参数,还有事件本身,newroutedeventhandler(testing)
和newroutedeventhandler(testing(chr))
都是对委托的误解,使用函数参考
正确传递参数
是一个重要的一点。感谢您更正了上次尝试的事件参数。这看起来也像是我试图实现的。@HowardP我没有看到你选择的答案有什么大的不同。我提供了足够的注释来理解,而答案的事件arg不正确,应该是RoutedEventArgs
:)塔奎恩的回答也给了我一些帮助我理解的解释。你的回答也很好,很遗憾,我不能同时接受这两个答案。我的道歉@Dongdong,我只是写了我的答案,没有看到你真诚的回答。虽然我不同意你关于EventArgs
的评论,但这是不正确的。因为我看到OP使用的是派生较少的类型,所以我也这样做了。。。语言允许这样做。。。试试你自己。。第二个参数甚至可以是object
@taquion类型的。不用担心,我们只需将其更正即可@HowardP,他的代码的问题不仅仅是参数,还有事件本身,newroutedeventhandler(testing)
和newroutedeventhandler(testing(chr))
都误解了委托
,使用函数引用
正确传递参数是一个重要的问题。