我正在测试一些功能,以了解 Blazor 在 Windows 窗体应用程序中托管的可能性。解决方案是文档中的解决方案,即经典计数器。 现在我正在尝试在 Windows 和 blazor 应用程序之间交换数据,它基于这篇文章工作:How to interact BlazorWebView and Windows Forms
具体来说,如果我这样称呼:
blazorWebView1.RootComponents.Add<Counter>("#app", new Dictionary<string, object> { { "dummy", "222" } });
我可以看到组件内部的参数并使用它的值。
但是我无法使用在组件内部触发并在主窗体中拦截的回调。
这是回调声明
[Parameter]
public EventCallback Callback { get; set; }
在 Windows 窗体中
public async Task DoSomething()
{
//anything here
}
并将方法传递给组件
blazorWebView1.RootComponents.Add<Counter>("#app", new Dictionary<string, object> { { "Callback",()=> DoSomething() } });
我使用了同一事物的几种变体,但总是出错。在这种情况下
无法将“System.Func`1[System.Threading.Tasks.Task]”类型的对象转换为“Microsoft.AspNetCore.Components.EventCallback”类型。
最佳答案
事件回调
如果您定义了 EventCallback 类型的参数:
private async void IncrementCount()
{
currentCount++;
await Callback.InvokeAsync();
}
[Parameter]
public EventCallback Callback { get; set; }
然后你可以像这样传递它:
blazorWebView1.RootComponents.Add<Counter>("#app",
new Dictionary<string, object?>
{
{"Callback", new EventCallback(null, ()=>{ MessageBox.Show("Hi"); }) }
});
操作
如果您定义了 Action 类型的参数:
private void IncrementCount()
{
currentCount++;
Callback?.Invoke();
}
[Parameter]
public Action Callback { get; set; }
然后你可以像这样传递它:
blazorWebView1.RootComponents.Add<Counter>("#app",
new Dictionary<string, object?>
{
{"Callback", ()=>{ MessageBox.Show("Hi"); } }
});
关于winforms - 在 Windows 窗体中向 blazor 混合添加回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74048004/