我正在研究一个利用WPF的C#应用程序,当前我希望在TreeViewItem对象获得焦点时触发事件。我已经使用以下代码以非常基本的方式实现了这个:
分配事件:
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));
我无法弄清楚如何做到这一点,我做的任何事都会导致语法错误。这通常是怎么做的/甚至是可能的?
任何帮助表示赞赏。
使用sender
参数,如下所示:
private void testing(object o, EventArgs e)
{
var treeViewItem = o as TreeViewItem;
}
碰巧发送者对象实际上是触发事件的对象,TreeViewItem就是你的情况
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
}
您应该使用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());
}
}
该方法将在e参数的“NewValue”属性中接收TreeViewItem,因此,MessageBox将显示项标签。