如何为动态加载的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);
但是它不会触发如果我点击按钮
修改
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);