具有参数发送器和 RoutedEventArgs 的 WPF 调用方法

本文关键字:RoutedEventArgs WPF 调用 方法 参数 | 更新日期: 2023-09-27 18:31:24

我是 c# wpf 的初学者,我正在尝试让这段代码工作,试图搜索它但我找不到它..,无论如何这是我代码中的问题:

基本上我连接到存储我的方法名称的数据库:例如(window2_open)然后在检索它之后,我将在代码隐藏中创建一个面板,并从数据集中添加方法名称:

// row[0].ToString() = window2_open
StackPanel panel = new StackPanel();
panel.AddHandler(StackPanel.MouseDownEvent, new MouseButtonEventHandler(row[0].ToString()));

但是我收到一个错误"预期方法名称",所以我在谷歌中查找并找到了这个:

MouseButtonEventHandler method = (MouseButtonEventHandler) this.GetType().GetMethod(row[0].ToString(), BindingFlags.NonPublic|BindingFlags.Instance).Invoke(this, new object[] {});

但是后来我得到参数不匹配错误,我发现我需要传递与函数需要相同的参数,这是我的函数:

private void window2_open(object sender, RoutedEventArgs e)
{
    window2 win2 = new window2();
    win2.ShowInTaskbar = false;
    win2.Owner = this;
    win2.ShowDialog();
}
// where window2 is another xaml

如何发送函数所需的相同参数?

具有参数发送器和 RoutedEventArgs 的 WPF 调用方法

这样的事情应该可以工作:

string methodName = nameof(window2_open); // Assume this came from the DB
panel.AddHandler(MouseDownEvent, new MouseButtonEventHandler((sender, args) =>
    {
        MethodInfo methodInfo = GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
        // The arguments array must match the argument types of the method you're calling
        object[] arguments = { panel, args };
        methodInfo.Invoke(this, arguments);
    }));

当然,如果要单击,您必须将新StackPanel添加到某个窗口中。(这是一个不寻常的架构。

(实际的鼠标处理程序是 lambda;您不希望在添加处理程序时调用它。

请参阅下面的链接: 在 C# 中从字符串调用函数

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);