使用 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");
}
我有一个 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");
}