Avalonia+Prism+Ubuntu部署指南

环境介绍

事项版本
开发工具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.AvaloniaPrism.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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值