如何为动态加载的gui创建和分配事件

本文关键字:创建 分配 事件 gui 动态 加载 | 更新日期: 2023-09-27 18:15:53

我正在尝试创建一个WPF应用程序,允许用户创建一个自定义gui动态加载一些xaml文件。

需要两个文件:

包含gui元素的主xaml文件

<Grid>
    <Button Name="button1" Height="82" Width="132">Button Text</Button>
    <TextBlock Text="Text Data"/>
</Grid>

和事件文件:

<Events>
    <Event Object="button1" Event="Click" File="button1OnClick"/>
</Events>

我正确加载了文件,显示了gui,但是没有触发事件(在本例中是按钮单击事件)。我试着用下面的代码(和它的一些变种):

/*
scroll = parent object of the custom gui (ScrollViewer)
events = List of the events in the events file
evnt.Event == "Click"
evnt.ObjectName == "button1"
evnt.File == "button1OnClick"
*/
List<DependencyObject> childs = scroll.GetLogicalChilds();
foreach (DependencyObject control in childs)
{
    Control c = null;
    if(control is DependencyObject)
        c = control as Control;
    if (c == null)
        continue;
    foreach(PluginEvent evnt in events)
    {
        if (evnt.ObjectName == c.Name) //button1 == button1
        {
            RoutedEvent routedEvent = EventManager.RegisterRoutedEvent(
                evnt.Event,
                RoutingStrategy.Bubble,
                typeof(RoutedEventHandler),
                c.GetType());
            Action handler = () => Lua.DoFile(evnt.File + ".lua");
            c.AddHandler(routedEvent, handler);
        }
    }
}

在这个例子中,当我点击名为button1的按钮时,我试图运行button1OnClick.lua文件,但我得到一个错误

处理程序类型不匹配。

,我不知道如何解决这个问题。有人能解释我如何运行lua文件时,事件被触发?

目标是在事件触发时运行在事件文件中声明的文件。

Edit1:
我用下面的代码修复了这个异常

RoutedEvent routedEvent = EventManager.RegisterRoutedEvent(evnt.Event, RoutingStrategy.Bubble, typeof(RoutedEventHandler), c.GetType());
RoutedEventHandler handler = (s, a) => Lua.DoFile(evnt.File + ".lua");
c.AddHandler(routedEvent, handler);

但是它不会触发如果我点击按钮

如何为动态加载的gui创建和分配事件

修改

Action handler = () => Lua.DoFile(evnt.File + ".lua");
c.AddHandler(routedEvent, handler);

给更多合适的事件处理程序

c.AddHandler(routedEvent, (delegate)(s, o) => Lua.DoFile(evnt.File + ".lua")); // not sure

根据你的评论(^^):

Action<object,RoutedEventHandler> handler = (s, o) => Lua.DoFile(evnt.File + ".lua");
c.AddHandler(routedEvent, handler);