0

内部に WebView を含む XAML ページがあります (MainPage.xaml など)。また、[AllowForWeb] 属性でマークされたクラスを持つ WinRT コンポーネントがあります。このコンポーネントは、MainPage.xaml が配置されているプロジェクトから参照され、コード ビハインドでAddWebAllowedObject メソッドが使用されます。また、循環依存のため、メイン プロジェクトを参照できません。

コンポーネントクラスから MainPage.xaml.cs メソッドを呼び出す方法は? ごく普通の状況。それを行う標準的な方法はありますか?

例えば。JavaScript から呼び出すことができる RT コンポーネント内のメソッドがあります。

     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として 3 番目のプロジェクトを作成しました。アクションの使用に制限はありません。このライブラリは、メイン プロジェクトと 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 に答える