使用 AllowForWeb 从引用的 WinRT 组件调用 WebView 页面方法 class

Call WebView page method from referenced WinRT Component with AllowForWeb class

我有一个 XAML 页面,其中包含 WebView(例如 MainPage.xaml)。我还有带有 class 标记为 [AllowForWeb] 属性的 WinRT 组件。此组件是从 MainPage.xaml 所在的项目中引用的,并且在代码隐藏中使用了 AddWebAllowedObject method。由于循环依赖,我无法引用主项目。

如何从组件 class 调用 MainPage.xaml.cs 方法?很平常的情况。有一些标准的方法吗?

例如。我在 RT 组件中有一个可以从 JavaScript

调用的方法
     public void ShowMessage(string message)
    {
       // I want to call here function from MainPage.xaml.cs
    }

How to call MainPage.xaml.cs methods from component class? Very usual situation. Is there are some standard way to do it?

是的,你可以通过delegate将方法从MainPage.xaml.cs传给WindowsRuntime Component(目前使用C#在Runtime Component中使用delegate非常有限,见this case,所以我使用 C++ 作为演示)。

对于运行时组件 Class MyClass.h:

public delegate Platform::String^ MyFunc(int a, int b);
public ref class MyClass sealed
{
public:
    MyClass();
    static Platform::String^ MyMethod(MyFunc^ func)
    {
        Platform::String^ abc=func(4, 5);
        return abc;
    }
};

并且您可以像下面这样在后面的代码中使用委托:

using MyComponentCpp;
private void myBtn_Click(object sender, RoutedEventArgs e)
{
   String abc=MyClass.MyMethod(MyMethod);
   myTb.Text = abc;
}
private String MyMethod(int a, int b)
{
    return (a.ToString() + b.ToString());//replace this line with your own logic.
}

这里是完整的演示:TestProject

感谢 @Elvis Xia 给了我想法,我找到了一个不用 C++ 的解决方案。

我已经创建了第三个项目 Class Library。它没有使用 Action 的限制。我从主项目和 WinRT 组件中引用了这个库。 class 库内代码:

    public class BridgeClass
{
    public static event Action<string> MessageReceived;

    public static void Broadcast(string message)
    {
        if (MessageReceived != null) MessageReceived(message);
    }
} 

带有 webview 的主项目中的代码是:

  // place somewhere 
  BridgeClass.MessageReceived += ShowMessage;

  // ....... and add a method
   void ShowMessage(string msg)
    {

    }

现在我可以从 WinRT 组件调用此代码:

 public void ShowMessage(string message)
{
      BridgeClass.Broadcast("lalala");
}