我想将数据从 Windows 窗体发送到 BlazorWebView 并接收从 Web 视图返回到窗体的通知。这个怎么做?在.Net6 Windows 窗体应用程序中。
BlazorWebView blazorApp = new BlazorWebView()
{
Dock = DockStyle.Fill,
HostPage = "wwwroot/index.html",
Services = serviceProvider
};
blazorApp.RootComponents.Add<App>("#app");
var form1 = new Form1();
form1.Controls.Add(blazorApp);
Application.Run(form1);
Run Code Online (Sandbox Code Playgroud)
小智 6
BlazorWebView 控件(我从现在起将其称为 BWV 以节省打字)的技巧是不要将其视为标准 WinForms/WPF 控件,而将其视为 ASP.NET Blazor 应用程序。因此,您正在与 Web 应用程序交互,而不是与通常的 WinForm 或 MAUI 控件交互。
发送数据
来回发送数据是通过标准依赖注入来处理的,就像在 ASP.NET 中所做的那样,因此使用要在 WinForms 应用程序和 BWV 之间传递的数据设置一个类并注入它。
使用您想要在 WinForms/Maui 应用程序和 BWV 之间传递的数据创建一个类:
public class AppState
{
public int Counter { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
实例化它并将其添加为 WinForms/Mai 应用程序中的单例
public partial class Form1 : Form
{
private readonly AppState _appState = new();
public Form1()
{
var services = new ServiceCollection();
services.AddWindowsFormsBlazorWebView();
services.AddSingleton<AppState>(_appState);
blazorApp.HostPage = "wwwroot\\index.html";
blazorApp.Services = services.BuildServiceProvider();
blazorApp.RootComponents.Add<Main>("#app");
Run Code Online (Sandbox Code Playgroud)
将其注入您的 .razor 页面以供使用。
public class AppState
{
public int Counter { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
同样 - 在 WinForms C# 代码中使用实例化的类
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(
owner: this,
text: $"Current counter value is: {_appState.Counter}",
caption: "Counter");
}
Run Code Online (Sandbox Code Playgroud)
请参阅https://github.com/dotnet/maui/tree/main/src/BlazorWebView/samples/BlazorWinFormsApp
发送通知
这可以使用 Razor 页面参数并使用操作或事件来完成。
我使用的一个示例只是 Razor 页面中的一个简单的 EventCallBack,因此在 Razor 页面中有一个如下所示的参数:
[Parameter]
public EventCallback Callback { get; set; }
Run Code Online (Sandbox Code Playgroud)
在您的 C# 代码中创建一个任务
public async Task DoSomething()
{
await Something();
... do other things
}
Run Code Online (Sandbox Code Playgroud)
现在将该任务作为参数传递给 Razor 页面。注意:为了简单起见,我在这里使用 Razor 组件,但您可以将参数传递给 IDictionary<string, object?>? 类型的 BWV,它表示要传递给根组件的可选参数字典。
<MyRazorControl Callback="Refresh"/>
Run Code Online (Sandbox Code Playgroud)
您可以从 Razor 页面中调用它
public partial class Form1 : Form
{
private readonly AppState _appState = new();
public Form1()
{
var services = new ServiceCollection();
services.AddWindowsFormsBlazorWebView();
services.AddSingleton<AppState>(_appState);
blazorApp.HostPage = "wwwroot\\index.html";
blazorApp.Services = services.BuildServiceProvider();
blazorApp.RootComponents.Add<Main>("#app");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2459 次 |
| 最近记录: |