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

8gsdolmq  于 2022-11-16  发布在  Windows
关注(0)|答案(1)|浏览(205)

我正在测试一些功能,看看Blazor在Windows窗体应用程序中的可能性。解决方案是文档中的一个,经典的计数器。现在我正在尝试在Windows和Blazor应用程序之间交换数据,它的工作原理基于本文:如何与Windows窗体交互
具体来说,如果我称之为:
blazorWebView1.RootComponents.Add<Counter>("#app", new Dictionary<string, object> { { "dummy", "222" } });
我可以看到组件内的参数并使用它的值。
但是我还不能使用在组件内部触发并在主窗体中拦截的回调。
这是回调声明

[Parameter]

    public EventCallback Callback { get; set; }

并在Windows Form

public async Task DoSomething()
        {
            //anything here
        }

以及将方法传递给组件

blazorWebView1.RootComponents.Add<Counter>("#app", new Dictionary<string, object> { { "Callback",()=> DoSomething() } });

我已经使用了同一件事的几个变体,但总是得到一个错误。在这种情况下
无法将类型为“System.Func”1[系统.线程.任务.任务]“的对象强制转换为类型”Microsoft.AspNetCore.Components. EventCallback“。

bbmckpt7

bbmckpt71#

事件回调

如果定义了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"); } }
    });

相关问题