一个Java Developer,免不了要兼职、要擦边各类客户端开发,桌面应用程序开发也不例外。遥想当年,我曾是一名.net 程序员,至今仍怀念那些用 WinForm 敲代码的日子。如今,因工作中的种种契机,我的目光再次聚焦到 C# 上,它依旧散发着独特魅力,每一次接触都能让我感受到那份久违的惊艳。
随着信创产业的蓬勃发展,国产操作系统正逐步走入公众视线。Deepin 作为 UOS 的社区版本,客观来讲,堪称国产操作系统中的翘楚。Deepin 23 开发桌面程序首选 Qt5 作为桌面程序的核心开发框架。然而,Qt5 所采用的 LGPL 开源协议,加之其相对较高的学习成本,着实让我们这些仅偶然从事相关开发的程序员还是感到压力不小。
2024年11月13日 · Microsoft 今天正式发布了 .NET 9,号称是迄今为止最高效、最现代、最安全、最智能、性能最高的 .NET 版本。基于dotnet开发,在上述情况下,对我来说乃是首选。
Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件,确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。
所以推出我这篇文章的主角:Deepin 23 + .net 9 + Avalonia UI 11.0.0
- 准备工作:
俗话说:美不美看大腿🦵,啊呸,先看桌面,精彩纷呈,艳!!!!!
在开始安装 dotnet 9 之前,确保 Deepin 23 系统已经更新到最新版本,这一步非常重要,可以避免在后续安装过程中可能出现的依赖问题。同时,由于 dotnet 9 需要一定的系统资源支持,确保电脑配置能够满足基本要求。
在终端输入系统更行代码:
sudo apt update && sudo apt upgrade -y
- 安装 .net 9
在Deepin 20+上安装.NET开发环境基本可以参照Debian的安装方式
安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库。
打开终端并运行以下命令:
wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
安装 .NET SDK,请运行以下命令:
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-9.0
下载速度感人,等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!
完成后输入下面命令查看版本
dotnet --version
- 安装 Avalonia 模板,请终端运行以下命令:
dotnet new install Avalonia.Templates
官网地址 : avaloniaui.net/
- 安装Rider 2024.3.3,现在非商用免费了
下载地址是:Rider: The Cross-Platform .NET IDE from JetBrains ,选择linux .tar.gz版本
下载后右键解压缩,解压缩后的文件夹拷贝到主目录,方便清理下载文件夹
打开/JetBrains Rider-2024.3.3/bin目录,双击rider,选择运行
选用免费非商业使用,并登录激活
安装 AvaloniaRider 插件
- 搭建项目脚手架
打开Rider,右边菜单选择Avalonia.NET MVVM App,MVVMToolkit,我选择了ReactiveUI
创建好项目后,直接点击运行,先看看效果:
- 创建一个简单的测试
打开/ViewModels/MainWindowViewModel.cs,修改如下:
using ReactiveUI;
using System;
namespace Learn.FirstDemo.ViewModels;
public class MainWindowViewModel : ViewModelBase
{
public MainWindowViewModel()
{
this.WhenAnyValue(o => o.Name)
.Subscribe(o => this.RaisePropertyChanged(nameof(Greeting)));
}
private string? _name;
public string? Name
{
get => _name;
set => this.RaiseAndSetIfChanged(ref _name, value);
}
public string Greeting
{
get
{
if (string.IsNullOrEmpty(Name))
{
// If no Name is provided, use a default Greeting
return "Hello World from FirstDemo"; }
else
{
// else Greet the User.
return $"Hello {Name}";
}
}
}
}
打开/Views/MainWindow.axaml,修改如下
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:Learn.FirstDemo.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Learn.FirstDemo.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="Learn.FirstDemo">
<Design.DataContext>
<!-- This only sets the DataContext for the previewer in an IDE,
to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
<vm:MainWindowViewModel />
</Design.DataContext>
<StackPanel Margin="40">
<TextBlock>输入你的名字:</TextBlock>
<TextBox Text="{Binding Name}" />
<TextBox Text="{Binding Greeting, Mode=OneWay}"
IsReadOnly="True"
FontWeight="Bold" />
</StackPanel>
</Window>
点击运行,查看效果
- 发布与运行
右键点击解决方案,选择发布,本地文件夹
配置发布参数如下,点击运行
发布后的文件位于项目文件夹bin目录之下
最后,发布程序通过命令行可以打包各平台的可以执行包,包括单文件的linux deb包,留给各位自行尝试。