具有参数发送器和 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
如何发送函数所需的相同参数?
这样的事情应该可以工作:
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);