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

西安专业做网站建站长工具ip地址查询域名

西安专业做网站建,站长工具ip地址查询域名,江苏常州建设银行网站,国外购物平台有哪些使用 CommunityToolkit.Mvvm 库重新设计激光直写控制软件的框架,展示现代 MVVM 实现方式。 一、项目结构 LaserDirectWriteApp/ ├── Models/ │ ├── LaserParameters.cs │ ├── MotionParameters.cs │ └── SystemStatus.cs ├── ViewModels/…

使用 CommunityToolkit.Mvvm 库重新设计激光直写控制软件的框架,展示现代 MVVM 实现方式。

一、项目结构

LaserDirectWriteApp/
├── Models/
│   ├── LaserParameters.cs
│   ├── MotionParameters.cs
│   └── SystemStatus.cs
├── ViewModels/
│   ├── MainViewModel.cs
│   ├── LaserControlViewModel.cs
│   ├── MotionControlViewModel.cs
│   └── PreviewViewModel.cs
├── Views/
│   ├── MainWindow.xaml
│   ├── LaserControlView.xaml
│   ├── MotionControlView.xaml
│   └── PreviewView.xaml
├── Services/
│   ├── ILaserService.cs
│   ├── IMotionService.cs
│   ├── LaserService.cs
│   └── MotionService.cs
├── Converters/
│   └── BooleanToStatusConverter.cs
└── App.xaml

 

二、核心实现

1. 安装必要包

dotnet add package CommunityToolkit.Mvvm
dotnet add package Microsoft.Extensions.DependencyInjection

2. 应用入口 (App.xaml.cs)

using Microsoft.Extensions.DependencyInjection;
using CommunityToolkit.Mvvm.DependencyInjection;public partial class App : Application
{public App(){// 配置依赖注入Ioc.Default.ConfigureServices(new ServiceCollection().AddSingleton<ILaserService, LaserService>().AddSingleton<IMotionService, MotionService>().AddTransient<MainViewModel>().AddTransient<LaserControlViewModel>().AddTransient<MotionControlViewModel>().AddTransient<PreviewViewModel>().BuildServiceProvider());}protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);var mainWindow = new MainWindow{DataContext = Ioc.Default.GetRequiredService<MainViewModel>()};mainWindow.Show();}
}

3. 主视图模型 (MainViewModel.cs)

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;public partial class MainViewModel : ObservableObject
{private readonly ILaserService _laserService;private readonly IMotionService _motionService;[ObservableProperty]private string _statusMessage = "系统就绪";[ObservableProperty][NotifyPropertyChangedFor(nameof(IsDisconnected))]private bool _isConnected;public bool IsDisconnected => !IsConnected;public MainViewModel(ILaserService laserService, IMotionService motionService){_laserService = laserService;_motionService = motionService;// 订阅设备状态消息WeakReferenceMessenger.Default.Register<DeviceStatusMessage>(this, (r, m) =>{StatusMessage = m.Message;});}[RelayCommand]private async Task ConnectAsync(){try{WeakReferenceMessenger.Default.Send(new DeviceStatusMessage("正在连接设备..."));await Task.WhenAll(Task.Run(() => _motionService.Connect()),Task.Run(() => _laserService.Connect()));IsConnected = true;WeakReferenceMessenger.Default.Send(new DeviceStatusMessage("设备连接成功"));}catch (Exception ex){WeakReferenceMessenger.Default.Send(new DeviceStatusMessage($"连接失败: {ex.Message}"));}}[RelayCommand(CanExecute = nameof(IsConnected))]private void Disconnect(){try{WeakReferenceMessenger.Default.Send(new DeviceStatusMessage("正在断开设备..."));_laserService.Disconnect();_motionService.Disconnect();IsConnected = false;WeakReferenceMessenger.Default.Send(new DeviceStatusMessage("设备已断开"));}catch (Exception ex){WeakReferenceMessenger.Default.Send(new DeviceStatusMessage($"断开失败: {ex.Message}"));}}[RelayCommand]private void Exit(){if (IsConnected) Disconnect();Application.Current.Shutdown();}
}public record DeviceStatusMessage(string Message);

4. 激光控制视图模型 (LaserControlViewModel.cs)

public partial class LaserControlViewModel : ObservableObject
{private readonly ILaserService _laserService;[ObservableProperty]private LaserParameters _parameters = new();public LaserControlViewModel(ILaserService laserService){_laserService = laserService;// 初始化默认值Parameters = new LaserParameters{Power = 30,Frequency = 1000,PulseWidth = 100};}[RelayCommand]private void ToggleLaser(){try{_laserService.SetEnabled(Parameters.IsEnabled);WeakReferenceMessenger.Default.Send(new DeviceStatusMessage($"激光器已{(Parameters.IsEnabled ? "开启" : "关闭"}"));}catch (Exception ex){WeakReferenceMessenger.Default.Send(new DeviceStatusMessage($"激光控制失败: {ex.Message}"));}}[RelayCommand]private void ApplySettings(){try{_laserService.SetPower(Parameters.Power);_laserService.SetFrequency(Parameters.Frequency);_laserService.SetPulseWidth(Parameters.PulseWidth);WeakReferenceMessenger.Default.Send(new DeviceStatusMessage("激光参数已更新"));}catch (Exception ex){WeakReferenceMessenger.Default.Send(new DeviceStatusMessage($"参数设置失败: {ex.Message}"));}}
}

5. 运动控制视图模型 (MotionControlViewModel.cs)

public partial class MotionControlViewModel : ObservableObject
{private readonly IMotionService _motionService;[ObservableProperty]private MotionParameters _parameters = new();public MotionControlViewModel(IMotionService motionService){_motionService = motionService;// 订阅位置更新_motionService.PositionUpdated += OnPositionUpdated;}private void OnPositionUpdated(object? sender, PositionUpdatedEventArgs e){Parameters.XPosition = e.X;Parameters.YPosition = e.Y;Parameters.ZPosition = e.Z;}[RelayCommand(CanExecute = nameof(CanMove))]private async Task MoveAsync(){try{await _motionService.MoveTo(Parameters.XTarget,Parameters.YTarget,Parameters.ZTarget);}catch (Exception ex){WeakReferenceMessenger.Default.Send(new DeviceStatusMessage($"移动失败: {ex.Message}"));}}private bool CanMove() => !_motionService.IsMoving;[RelayCommand]private async Task HomeAsync(){try{await _motionService.Home();WeakReferenceMessenger.Default.Send(new DeviceStatusMessage("已回原点"));}catch (Exception ex){WeakReferenceMessenger.Default.Send(new DeviceStatusMessage($"回原点失败: {ex.Message}"));}}
}

6. 主窗口视图 (MainWindow.xaml)

<Window x:Class="LaserDirectWriteApp.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"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:local="clr-namespace:LaserDirectWriteApp.Views"mc:Ignorable="d"Title="激光直写控制系统" Height="800" Width="1200"><DockPanel><!-- 顶部菜单 --><Menu DockPanel.Dock="Top"><MenuItem Header="文件"><MenuItem Command="{Binding ExitCommand}" Header="退出"/></MenuItem><MenuItem Header="设备"><MenuItem Command="{Binding ConnectCommand}" Header="连接"/><MenuItem Command="{Binding DisconnectCommand}" Header="断开" IsEnabled="{Binding IsConnected}"/></MenuItem></Menu><!-- 状态栏 --><StatusBar DockPanel.Dock="Bottom"><StatusBarItem><TextBlock Text="{Binding StatusMessage}"/></StatusBarItem></StatusBar><!-- 主内容区 --><TabControl><TabItem Header="激光控制"><local:LaserControlView DataContext="{Binding Source={x:Static Ioc.Default}, Path=GetRequiredService{LaserControlViewModel}}"/></TabItem><TabItem Header="运动控制"><local:MotionControlView DataContext="{Binding Source={x:Static Ioc.Default}, Path=GetRequiredService{MotionControlViewModel}}"/></TabItem><TabItem Header="预览"><local:PreviewView DataContext="{Binding Source={x:Static Ioc.Default}, Path=GetRequiredService{PreviewViewModel}}"/></TabItem></TabControl></DockPanel>
</Window>

三、CommunityToolkit.Mvvm 优势体现

  1. 极简代码:使用 [ObservableProperty] 和 [RelayCommand] 大幅减少样板代码

    • 传统方式需要 20+ 行代码的属性现在只需 1 行

    • 命令实现从 10+ 行减少到 1 行属性

  2. 类型安全:源码生成器保证编译时类型检查

[ObservableProperty]
private string _name; // 自动生成 Name 属性,带通知功能

现代化异步支持

[RelayCommand]
private async Task LoadDataAsync()
{// 自动处理异步操作和异常
}

弱引用消息:避免内存泄漏

WeakReferenceMessenger.Default.Register<MyMessage>(this, (r, m) => { });

依赖注入集成

// 配置
Ioc.Default.ConfigureServices(services);// 使用
var vm = Ioc.Default.GetRequiredService<MyViewModel>();

四、扩展建议

  1. 添加验证:结合 DataAnnotations 实现属性验证

[ObservableProperty]
[Required(ErrorMessage = "功率不能为空")]
[Range(0, 100, ErrorMessage = "功率必须在0-100之间")]
private double _power;

使用记录类型:为消息定义不可变模型

public record PositionMessage(double X, double Y, double Z);

添加单元测试:利用轻量级特性简化测试

var vm = new LaserControlViewModel(mockLaserService);
vm.ToggleLaserCommand.Execute(null);
mockLaserService.Verify(x => x.SetEnabled(true));

这个实现展示了如何使用 CommunityToolkit.Mvvm 构建现代化、高性能的激光直写控制软件,相比传统 MVVM 实现代码量减少约 40%,同时提高了可维护性和类型安全性。

http://www.dtcms.com/wzjs/394087.html

相关文章:

  • 台州网站优化方案网站制作教程
  • 做鸭加盟最火的网站seo岗位是什么意思
  • 如何做网站数据分析99个创意营销方案
  • 济南网站制作企业关键词挖掘ppt
  • 网站 版式做网络推广好吗
  • 仿魔酷阁网站源码百度引流推广费用多少
  • 珠海网站建设价格佛山关键词排名工具
  • 网店怎么注册开网店百度快照优化排名推广
  • 金坛做网站哪家好域名注册官网免费
  • 做公司集团网站茶叶网络营销策划方案
  • 百度做的网站首页在线客服修改怎么建立自己的网页
  • 同一人可以做几个网站的负责人关键词分为哪几类
  • 大城县建设局网站杭州seo托管公司推荐
  • 广州网站建设服务电话seo推广计划
  • 网站开发需求文档seo优化软件有哪些
  • 北京网站建设升上去痘痘该如何去除效果好
  • 商丘网站建设.com亚马逊排名seo
  • 网站为什么做优化ppt太原做网络推广的公司
  • 深圳维特网站建设济南seo优化外包服务
  • 内容转载的网站怎么做优化大师客服
  • 做网站排名推广效果怎么样刷神马seo排名首页排名
  • 用asp.net 做网站网站模板之家
  • 柳州正规网站制作公司今日新闻热点大事件
  • 湛江网站建设外包国外引流推广平台
  • 济南疫情重点地区sem和seo是什么意思
  • 网站推广排名怎么做首页图片点击率如何提高
  • erp系统如何操作seo公司发展前景
  • 新型网站设计搜索引擎优化的基础是什么
  • 北京网站开发建设 58同城营销方式和营销策略
  • 公司网站设计素材中国搜索引擎大全