winforms - 在 Windows 窗体中向 blazor 混合添加回调

标签 winforms blazor blazor-hybrid

我正在测试一些功能,以了解 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/

相关文章:

c# - 以 WebBrowser 窗体(Windows 窗体 C#)完全加载页面时的 DocumentCompleted 事件

.net - 在设计时隐藏私有(private)子控件属性

blazor - MudBlazor 中的 MudChip 双向绑定(bind)?

c# - Blazor WebAssembly - 如何在自动生成的 web.config 中添加 "http to https"URL 重写规则

asp.net-core - Blazor 应用程序中的数据检索返回空数组

c# - $(this) 在 C# 中等效

C# 正确的程序结构