Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据传递到RoutedEventHandler函数中_C#_Wpf_Routed Events - Fatal编程技术网

C# 如何将数据传递到RoutedEventHandler函数中

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

我正在开发一个利用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));
我不太明白怎么做,我做的任何事情都会导致语法错误。这通常是如何做到的/甚至可能吗


非常感谢您的帮助。

您应该使用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))
都误解了
委托
,使用
函数引用
正确传递
参数是一个重要的问题。