[Avalonia] 练习一:搭建Avalonia+Prism+Material项目

news/2024/11/28 0:27:40/文章来源:https://www.cnblogs.com/pumbaa/p/18570760
  这是个练手项目,初次接触Avalonia,决定搭建一个架构由Prism实现,UI基于Material的演示基本控件、自定义控件、遮罩、弹窗、标签页等UI基础的桌面项目,实现这些UI基础,基于WPF转Avalonia应该就没太大的问题了。
一、新建项目。
  1. 新建空白解决方案AvaloniaApps。
  2. 新建项目,选择Avalonia .NET MVVM App (AvaloniaUl),下一步。
  3. 在创建之前勾选“Remove View Locator”,使用Prism的View Locator就可以了,同样的,MVVM Toolkit也是使用Prism,这里无法取消勾选,先默认CommunityToolKit。
0
  1. 项目建好后,右键项目“管理 Nuget 程序包”,将已安装的“CommunityToolkit.Mvvm”卸载掉。
  2. 安装 Nuget 包:Prism.DryIoc.Avalonia、Material.Avalonia.DataGrid。

二、集成Prism。

  1. 基于Prism的BindableBase实现ViewModel-First的ViewModelBase。
    public abstract class PrismViewModelBase : BindableBase
    {/// <summary>/// 创建视图/// </summary>/// <returns></returns>/// <exception cref="Exception"></exception>public virtual Control CreateView(){var type = this.GetType();// 按命名规则获取View的类型string? nameSpace = null;if (type.Namespace is { } ns){nameSpace = ns.Replace("ViewModel", "View");}var name = type.Name.Replace("ViewModel", "View");var fullName = nameSpace == null ? name : $"{nameSpace}.{name}";var definedTypes = type.Assembly.DefinedTypes.ToList();var viewType = definedTypes.FirstOrDefault(q => q.FullName == fullName);if (viewType == null){fullName = fullName.Replace("ViewModel", "View");viewType = definedTypes.FirstOrDefault(q => q.FullName == fullName);if (viewType == null){throw new Exception(type.FullName + "对应的View未找到!");}}if (Activator.CreateInstance(viewType) is not Control { } control){throw new Exception($"{Activator.CreateInstance(viewType)?.GetType().FullName}无法转换为类型{typeof(Control).FullName}。");}control.DataContext = this;Control = control;return control;}/// <summary>/// 视图/// </summary>public Control? Control { get; set; }
    }
    1. CreateView是public方法,调用CreateView方法根据命名规则自动查找View,并将View的DataContext设为当前ViewModel。
    2. 不调用CreateView方法则可以兼容Prism的View-First方式,比如在axaml中使用prism:ViewModelLocator.AutoWireViewModel="True",或者IRegionManager.RegisterViewWithRegion方法;
  2. 那么使用Prism的View-First方式创建的ViewModel如何对Control(视图)赋值呢?使用ViewModelLocationProvider.SetDefaultViewModelFactory监听ViewModel实例化,代码如下:
    ViewModelLocationProvider.SetDefaultViewModelFactory((view, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] viewModelType) =>
    {var viewModel = Activator.CreateInstance(viewModelType);if (viewModel is PrismViewModelBase myViewModel && view is Control control){myViewModel.Control = control;}return viewModel;
    });
  3. 启动App。
    using Avalonia;
    using Avalonia.Controls;
    using Avalonia.Controls.ApplicationLifetimes;
    using Avalonia.Data.Core.Plugins;
    using Avalonia.Markup.Xaml;
    using AvaloniaDesktopApp.ViewModels;
    using GntAvaloniaCore.Mvvm;
    using GntAvaloniaCore.Utils;
    using Prism.DryIoc;
    using Prism.Ioc;
    using Prism.Mvvm;
    using System;
    using System.Diagnostics.CodeAnalysis;namespace AvaloniaDesktopApp
    {public class App : PrismApplication{public override void Initialize(){AvaloniaXamlLoader.Load(this);// Required when overriding Initializebase.Initialize();}[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "<Pending>")]public override void OnFrameworkInitializationCompleted(){if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop){// Line below is needed to remove Avalonia data validation.// Without this line you will get duplicate validations from both Avalonia and CTBindingPlugins.DataValidators.RemoveAt(0);var mainWindowViewModel = Container.Resolve<MainWindowViewModel>();desktop.MainWindow = mainWindowViewModel.View;}base.OnFrameworkInitializationCompleted();}protected override AvaloniaObject CreateShell(){// 获取主窗口的 ViewModel 并启动相应的 View// ViewModel-Firstvar mainWindowViewModel = Container.Resolve<MainWindowViewModel>();return mainWindowViewModel.CreateView();}protected override void RegisterTypes(IContainerRegistry containerRegistry){// Register you Services, Views, Dialogs, etc.// 注册 MainWindowViewModelcontainerRegistry.RegisterSingleton<ILog, NLogWrapper>();containerRegistry.RegisterSingleton<MainWindowViewModel>();}protected override void OnInitialized(){base.OnInitialized();ViewModelLocationProvider.SetDefaultViewModelFactory((view, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] viewModelType) =>{var viewModel = Activator.CreateInstance(viewModelType);if (viewModel is PrismViewModelBase myViewModel && view is Control control){myViewModel.Control = control;  // 将 View 注入 ViewModel
                    }return viewModel;});// Register Views to the Region it will appear in. Don't register them in the ViewModel.//var regionManager = Container.Resolve<IRegionManager>();// WARNING: Prism v11.0.0-prev4// - DataTemplates MUST define a DataType or else an XAML error will be thrown// - Error: DataTemplate inside of DataTemplates must have a DataType set//regionManager.RegisterViewWithRegion(nameof(RegionNames.MainWindowContentRegion), typeof(WindowTestView));
            }}
    }
    1. App集成PrismApplication。
    2. 注册 MainWindowViewModel 为单例,在CreateShell初始化MainWindowViewModel单例,并通过CreateView返回对应的View,在OnFrameworkInitializationCompleted中再次获取MainWindowViewModel单例,并将View设为MainWindow。

三、引入Material主题。

<Application xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:themes="clr-namespace:Material.Styles.Themes;assembly=Material.Styles"x:Class="AvaloniaDesktopApp.App"><Application.Styles><themes:MaterialTheme BaseTheme="Light" PrimaryColor="Blue" SecondaryColor="Yellow" /><StyleInclude Source="avares://GntAvaloniaUI/Styles/Generic.axaml"/></Application.Styles>
</Application>
  1. 使用Material主题色。
0
 
Git代码仓库:AvaloniaApps: C#跨平台Avalonia演示Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/841758.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【cesium】修改底图颜色为蓝色科技范儿

cesium中,默认的底图颜色往往难以满足个性化需求,而【蓝色科技】风格常常备受青睐,本文从实操角度介绍实现方法。 简单来说,我们所用的方法叫做【反色滤镜】,总的分为2个步骤,反色,过滤。具体做法如下: 首先要获取目标影像图层,这里不能直接对div进行操作,因为会将地…

51单片机入门:独立按键(02)

标题: ​ 51单片机入门:独立按键(02) 一、独立按键的基本结构和功能二、独立按键在单片机的位置三、初次使用独立按键 设计第1个程序,使用按键K1控制D1的亮灭 #include<regx52.h>void main() {while(1){if(P3_1 == 0) // 按下按钮相当于接地 P3_1 == 0; {P2_0 = 0…

【cesium】打造科技感建筑泛光效果

一些智慧城市项目经常需要加载建筑白膜数据(3dtiles),并制作炫酷的炫光效果,在cesium中可以使用自定义着色器修改白膜建筑的外观。 1.首先,加载3Dtiles格式的建筑白膜数据,这里我们使用一个免费的数据链接: data.mars3d.cn/3dtiles/jzw… 这是mars3D提供的一个链接,发送…

k8s容器中的Java进程经常自动被杀

故事背景 主角:低代码项目agile-bpm 时间:2023-08-29 背景:项目通过jenkins部署k8s容器到虚拟机,在一次部署之后,服务发生无限重启的现象,springboot项目起来后没多久(甚至有几次还没启动)就会被杀掉进程,服务宕机了一个晚上。 排查过程 查看日志 通过 kubelet logs 命…

从零开始:苹果手机免越狱群控系统的快速入门指南

对于初次接触苹果手机免越狱群控系统的用户来说,可能会感到有些困惑和不知所措。本章将提供一个详细的快速入门指南,帮助你从零开始,轻松掌握如何设置和使用这项强大的技术。免越狱群控系统概述 苹果手机免越狱群控系统是一种通过合法合规的技术手段,在不破坏iOS系统安全性…

网站模板文字内容修改,如何在网站后台或代码编辑器中修改模板文字内容

修改模板文字内容可以提升网站的信息传达效果。以下是具体步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单栏中的“模板”或“主题”。 选择“模板管理”或…

网站模板文字内容修改,如何在网站后台或代码编辑器中准确修改模板文字内容

修改模板文字内容可以提升网站的信息传达效果。以下是如何准确在网站后台或代码编辑器中修改模板文字内容的步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单…

本地git分支如何关联远程分支

背景 本文记录一下本地的git仓库如何与远程仓库同步,参考了网友的办法和官方的文档 如果对某些命令有疑惑,可以在命令行输入 git {command} --help 查看git的文档,例如 git remote --help ,会打开本地的帮助文件 操作步骤 首先切到本地仓库所在路径,如果git还没有初始化,…

多校A层冲刺NOIP2024模拟赛26

多校A层冲刺NOIP2024模拟赛26\(T1\) A. 随机游走 \(100pts/100pts\)在树上做临项交换即可。点击查看代码 struct node {ll nxt,to,w; }e[500010]; ll head[500010],v[500010],siz[500010],sum[500010],cnt=0,ans=0,tim=0; struct quality {ll sumt,siz,to,w; }; vector<qual…

支持4种类型的jQuery轮播图插件EasySlides

EasySlides是一款支持4种类型的jQuery轮播图插件。该jquery轮播图采用响应式设计,支持移动设备,内置有大图轮播,多图轮播,封面轮播和圆形轮播四种轮播图模式可供选择。在线演示 下载使用方法 在页面中引入jquery和jquery.easy_slides.js文件,以及样式文件jquery.easy_sl…

Avalonia 中使用 CEF 在 Ubuntu 运行崩溃分析

在 Linux 上使用 Avalonia 和 CefGlue:崩溃分析 介绍 本文主要记录了在 Avalonia 中使用 CefGlue(基于 .NET 的 Chrome 嵌入内核的封装库)时遇到的问题,目的是测试 Avalonia 的 Chrome 内核在 Linux 系统中的兼容性。然而在实际运行时,我们意外地遇到了运行崩溃的问题。环…

视频智能分析助力城市管理革新

在智慧城市建设的大潮中,视频智能分析技术正成为城市管理革新的重要推手。这项技术通过深度学习和人工智能算法,对视频数据进行实时分析和处理,为城市管理提供了前所未有的智能支持。本文将探讨视频智能分析技术在城市管理中的应用内容,以及它如何助力城市治理向更高效、更…