0

我一直在试图弄清楚如何在 webkit-sharp 中捕获来自 WebKit 的 close-web-view 和控制台消息信号(不幸的是,我必须使用 Ubuntu 16.04 包装上可用的 webkitsharp)。

我以为我有这个工作,但似乎我没有。

首先,我重写了 WebView 类:

public class MyWebView : WebKit.WebView
{
   [Signal("console-message")]
   public event ConsoleSignalHandler ConsoleMessage {
      add {
         Signal signal = Signal.Lookup(this, "console-message", typeof(ConsoleSignalArgs));
         signal.AddDelegate(value);
      }
      remove {
         Signal signal = Signal.Lookup(this, "console-message", typeof(ConsoleSignalArgs));
         signal.RemoveDelegate(value);
      }
   }
}

我还将 ConsoleSignalArgs 定义为:

public class ConsoleSignalArgs : SignalArgs {

    public String Source {
        get {
            return (String)base.Args [3];
        }
    }

    public Int32 Line {
        get {
            return (Int32)base.Args [2];
        }
    }

    public String Message {
        get {
            return (String)base.Args [1];
        }
    }
}

并且 ConsoleSignalHandler 定义为:

public delegate void ConsoleSignalHandler(object o, ConsoleSignalArgs e);

然后我实例化我的 web 视图并附加到这个事件,但是没有任何反应。我可以告诉控制台消息正在发送,因为我可以在控制台上看到它们,但是这些看起来来自 WebView 本身而不是我的代码。

private void CreateWebView() {
    this.m_webView = new MyWebView();

    this.m_webView.Editable = false;
    this.m_webView.TitleChanged += (o, e) => {
        this.Title = "Title Changed Got Fired!";
    };
    this.m_webView.ConsoleMessage += (sender, e) => {
        Console.WriteLine("Console Message Got Here!");
                    Debug.WriteLine("Got Here!");
    };
}

我究竟做错了什么?

附录:我还注意到,当我在调试器中停止代码并检查“信号”时,属性处理程序会抛出 NullReferenceException。

4

1 回答 1

0

发现问题。事实证明,匿名代表不适用于某些信号。这是正确的解决方案仅供参考:

this.m_webView.ConsoleMessage += new ConsoleSignalHandler(this.ConsoleMessage);

...

[ConnectBefore]
private void ConsoleMessage(System.Object sender, ConsoleSignalArgs e) {
    Console.WriteLine("Console Message got Here!");
}
于 2017-11-02T21:53:52.510 回答