0

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

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

例如。我在 RT 组件中有一个可以从 JavaScript 调用的方法

     public void ShowMessage(string message)
    {
       // I want to call here function from MainPage.xaml.cs
    }
4

2 回答 2

1

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

是的,您可以通过委托将 MainPage.xaml.cs 中的方法传递给 Windows 运行时组件(目前delegate在使用 C# 的运行时组件中使用非常有限,看这个案例,所以我使用 C++ 作为演示)。

对于运行时组件类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

于 2016-07-04T09:26:10.870 回答
0

感谢@Elvis Xia,他给了我想法,我找到了一个解决方案,如何在没有 C++ 的情况下做到这一点。

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

    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");
}
于 2016-07-05T06:13:41.593 回答