环境介绍
事项 | 版本 |
---|---|
开发工具 | VS2022 |
Ubuntu版本(虚拟机) | Ubuntu-22.04.2 |
.Net版本 | 8.0 |
Avalonia版本 | 11.1.0 |
参考博文:
NET / C# 开发 Ubuntu Desktop 跨平台图形界面桌面程序 Avalonia
Ubuntu 安装 .NET SDK / .NET Runtime 支持
扩展工具安装
VS顶部依次点击:扩展>>管理扩展,搜索avalonia
安装如下三个扩展,安装成功后需要重启VS
项目创建
打开VS选择Avalonia C# Project
,如下图依次选择并创建项目
这里选择Community Toolkit
,后续会移除
这一步与平台特性有关,先不选,具体待探索
创建后编译运行即可。
运行时出现以下错误提示:
找不到资产文件“xxx\project.assets.json”。运行 NuGet 包还原以生成此文件。
VS顶部依次点击工具>>NetGet包管理器>>程序包管理器控制>>控制台中输入以下命令:dotnet restore
Prism替换
为测试Prsim,示例程序使用
Region
进行简单测试,即将主窗口(MainWindow
)用一个区域(MainView
)去填充
关于Prism Region的使用这里不在赘述
AvaloniaPrismTest工程,移除CommunityToolkit.Mvvm
包,安装Prism.Avalonia
、Prism.DryIoc.Avalonia
包
删除ViewModels/ViewModelBase.cs
文件
创建MainWindowViewModel.cs
文件
using AvaloniaPrismTest.Views;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static ImTools.ImMap;
namespace AvaloniaPrismTest.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private readonly IRegionManager _regionManager;
public MainWindowViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
_regionManager.RegisterViewWithRegion("MenuRegion", nameof(MainView));
}
}
}
修改MainViewModel.cs
文件
using Prism;
using Prism.Mvvm;
using Prism.Regions;
using System;
namespace AvaloniaApplication1.ViewModels;
public partial class MainViewModel : BindableBase, INavigationAware
{
private string _Hellow = "Hello Avalonia! ";
public string Hellow
{
get { return _Hellow; }
set { SetProperty(ref _Hellow, value); }
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
修改MainWindow.axaml
<!--
需要注意以下两行代码
xmlns:vm="using:AvaloniaPrismTest.ViewModels"
x:DataType="vm:MainWindowViewModel"
-->
<Window
x:Class="AvaloniaPrismTest.Views.MainWindow"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:AvaloniaApplication1"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:prism="http://prismlibrary.com/"
xmlns:views="clr-namespace:AvaloniaPrismTest.Views"
xmlns:vm="using:AvaloniaPrismTest.ViewModels"
Title="AvaloniaApp"
d:DesignHeight="450"
d:DesignWidth="800"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
mc:Ignorable="d">
<Grid>
<ContentControl prism:RegionManager.RegionName="MenuRegion" />
</Grid>
</Window>
修改MainView.axaml
<!--
需要注意以下两行代码
xmlns:vm="using:AvaloniaPrismTest.ViewModels"
x:DataType="vm:MainViewModel"
-->
<UserControl
x:Class="AvaloniaPrismTest.Views.MainView"
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="using:AvaloniaPrismTest.ViewModels"
d:DesignHeight="450"
d:DesignWidth="800"
x:DataType="vm:MainViewModel"
mc:Ignorable="d">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding Hellow}" />
</UserControl>
App.axaml.cs
文件修改
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Data.Core.Plugins;
using Avalonia.Markup.Xaml;
using AvaloniaPrismTest.ViewModels;
using AvaloniaPrismTest.Views;
using Prism.DryIoc;
using Prism.Ioc;
using Prism.Mvvm;
namespace AvaloniaPrismTest;
public partial class App : PrismApplication
{
//需要去除
//public override void Initialize()
//{
// AvaloniaXamlLoader.Load(this);
//}
public override void OnFrameworkInitializationCompleted()
{
// Line below is needed to remove Avalonia data validation.
// Without this line you will get duplicate validations from both Avalonia and CT
BindingPlugins.DataValidators.RemoveAt(0);
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow
{
DataContext = new MainViewModel()
};
}
else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
{
singleViewPlatform.MainView = new MainView
{
DataContext = new MainViewModel()
};
}
base.OnFrameworkInitializationCompleted();
}
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.Register<MainWindow, MainWindowViewModel>();
}
protected override AvaloniaObject CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void OnInitialized()
{
base.OnInitialized();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<MainView, MainViewModel>(nameof(MainView));
}
}
发布程序
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5410a6cfbcea42f59590d77df2dac1bb.png
报错内容如下:
Ubuntu中运行程序
虚拟机安装Ubuntu系统请参考其他博主文章,这里就不赘述了
将发布的linux-x64
文件夹整体拷贝到Ubuntu
系统中
在 Ubuntu 中运行命令:
# 安装dot环境
apt-get install -y dotnet-sdk-8.0
#运行程序
dotnet HelloWorld.Desktop.dll