当前位置: 首页 > news >正文

Avalonia+ReactiveUI+SourceGenerators带返回值的异步命令实现

在Avalonia+ReactiveUI+SourceGenerators组合下设计带返回值的异步命令,在不阻塞主线程的情况下执行耗时较长的程序代码,待代码执行完毕后,返回并显示结果,设计一简单示例如下:

1、必要的包引用

    <PackageReference Include="Avalonia" Version="11.3.6" /><PackageReference Include="Avalonia.ReactiveUI" Version="11.3.6" /><PackageReference Include="ReactiveUI.SourceGenerators" Version="2.4.1">

2、ViewModel (使用 ReactiveUI Source Generators)

using ReactiveUI;
using ReactiveUI.SourceGenerators;
using System;
using System.Threading;
using System.Threading.Tasks;namespace AvaRea.ViewModels
{public partial class TestCmdViewModel: ReactiveObject{[ObservableAsProperty]private string _comResult;[ReactiveCommand]private async Task<string> ComDataAsync(){// 模拟耗时操作await Task.Delay(1000);// 模拟数据计算return $"数据计算完成: {3+4}";}      public TestCmdViewModel(){// _comResultHelper是由ReactiveUI.SourceGenerators.ObservableAsPropertyGenerator生成的可观察属性_comResultHelper = ComDataCommand.ToProperty(this, x=>x.ComResult, scheduler: RxApp.MainThreadScheduler)}}
}

3、View

<Windowx:Class="AvaRea.TestCmdView"xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:vm="clr-namespace:AvaRea.ViewModels"Title="测试带返回值的异步命令"Width="300"Height="400"d:DesignHeight="400"d:DesignWidth="300"x:DataType="vm:TestCmdViewModel"mc:Ignorable="d"><StackPanel Margin="20" Spacing="10">       <Button Content="开始计算" Command="{Binding ComDataCommand}"/><TextBlock Text="{Binding ComResult}" Margin="0,10,0,0"/>    </StackPanel>
</Window>

4、App.axaml

<Application xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"x:Class="AvaRea.App"RequestedThemeVariant="Default"><!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. --><Application.Styles><FluentTheme /></Application.Styles>
</Application>

5、App.axaml.cs

using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using AvaRea.ViewModels;namespace AvaRea;public partial class App : Application
{public override void Initialize(){AvaloniaXamlLoader.Load(this);}public override void OnFrameworkInitializationCompleted(){if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop){desktop.MainWindow = new TestCmdView{DataContext = new TestCmdViewModel()};}else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform){singleViewPlatform.MainView = new TestCmdView{DataContext = new TestCmdViewModel()};}base.OnFrameworkInitializationCompleted();}
}

6、Program.cs

using System;using Avalonia;
using Avalonia.ReactiveUI;namespace AvaRea.Desktop;class Program
{// Initialization code. Don't use any Avalonia, third-party APIs or any// SynchronizationContext-reliant code before AppMain is called: things aren't initialized// yet and stuff might break.[STAThread]public static void Main(string[] args) => BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);// Avalonia configuration, don't remove; also used by visual designer.public static AppBuilder BuildAvaloniaApp()=> AppBuilder.Configure<App>().UsePlatformDetect().WithInterFont().LogToTrace().UseReactiveUI();
}

7、主要特点

通过ReactiveUI.SourceGenerators.ObservableAsPropertyGenerator生成的可观察属性_comResultHelper获取命令的返回值,通过ToProperty方法转化为可绑定属性ComResult。

总结

Avalonia 给你跨平台的舞台,ReactiveUI 给你响应式的灵魂,Source Generators 为你自动生成代码,减少编写繁杂的样板代码烦恼;三者合体 = 用最少的代码,写出最快、最稳、最易维护的跨平台 .NET UI。

http://www.dtcms.com/a/619241.html

相关文章:

  • C++中自增自减运算符的重载
  • 用vs2010做网站应用程序脱机模板建站oem代理
  • 做得好的网站手机怎么进入国外网站
  • 网站建设视频vs南通做网站多少钱
  • 学院网站设计说明书网络营销的职能是什么
  • 营口化工网站建设支持wordpress的mysql
  • 网站科技感颜色城市焦点商城网站建设案例
  • Android 开发架构
  • 深入理解Ansible条件语句:从基础到高级应用
  • 怎样做海外淘宝网站地方生活门户网站有哪些
  • 学习周报二十二
  • 软件第三方检测机构选择的五大关键问题
  • 整站网站优化运营加强学院网站建设
  • 网站开发项目报告书商标设计网软件
  • 【电工】网线(T568B线序)的制作
  • 香蕉叶子病害分类数据集898张4类别
  • 用AI点亮心扉:我的数字人才技能大赛参赛项目——“心语之光”智能体全解析
  • 制作企业官网重庆seo案例
  • 【Linux驱动开发】Linux块设备驱动开发详解
  • 做私人网站 违法深圳seo优化多少钱
  • 做毕业设计免费网站建设vs和dw做网站的区别
  • 怎么把网站源码扒下来昆明网签备案查询系统
  • PPTX 中加入输入框和按钮,文本框不为空点击按钮跳转
  • Spring ResponseEntity 全面详解
  • 如何统计网站访问量wordpress能仿站吗
  • 注册网站后邮箱收到邮件酒店类网站开发策略
  • 北京昌盛宏业网站建设wordpress站点管理
  • intitle 网站建设大余网站
  • 单元级别性能测试
  • FPGA外部存储器深度解析 (二)深入理解DDR3基础与FPGA控制器