【问题标题】:How to create and assign events to dynamically loaded gui?如何创建事件并将其分配给动态加载的 gui?
【发布时间】:2014-07-31 12:12:48
【问题描述】:

我正在尝试创建一个 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 文件吗?

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

编辑1:
我用这段代码修复了异常

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);

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

【问题讨论】:

    标签: c# wpf routed-events


    【解决方案1】:

    改变这个

    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);
    

    【讨论】:

    • 这不起作用,因为不允许使用 lambda 表达式 :( 它必须是一个委托,Action&lt;object, RoutedEventHandler&gt; handler = (s, o) =&gt; { LuaHelper.DoFile(evnt.File); }; 也不起作用。我得到同样的异常 :(
    • 没有。我无法将 lambda 表达式转换为这样的委托。这就是为什么我为此使用Action&lt;&gt;。但我还是试过了,还是不行。
    • 在纠正错误方面,你是比我更好的程序员 =P
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多