前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用

dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用

作者头像
林德熙
发布于 2020-09-06 14:03:07
发布于 2020-09-06 14:03:07
2.9K00
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

在前面几篇博客告诉大家如何部署 GTK 应用,此时的应用是特别弱的,大概只是到拖控件级。尽管和 WinForms 一样也能写出特别强大的应用,但是为了提升一点开发效率,咱开始使用 xaml 神器写界面。本文告诉大家如何在 UOS 国产系统上,通过 Xamarin.Forms 使用 XAML 写界面逻辑,构建出 GTK 应用

本文将使用特别底层的方法告诉大家如何一步步创建,而不是告诉大家如何在 IDE 上进行快速的创建。因此本文更适合用来告诉大家一些基础的内容,而不适合用来规模化创建上

请注意,本文的步骤很多,只是我为了让大家能了解更多细节。实际上没有那么复杂

在开始之前,请确定你安装好了环境,如何安装请看下面博客

  • dotnet 在 UOS 国产系统上安装 MonoDevelop 开发工具
  • dotnet 在 UOS 国产系统上使用 MonoDevelop 创建 GTK 全平台带界面应用
  • dotnet 在 UOS 国产系统上使用 MonoDevelop 进行拖控件开发 GTK 应用

如 dotnet 在 UOS 国产系统上使用 MonoDevelop 创建 GTK 全平台带界面应用 所说,创建一个空白的 GTK# 应用

接着创建一个控制台项目,假定这个项目是 A 项目,这个控制台项目将会添加 Xamarin.Foms 负载,然后将构建出基于 Xamarin.Forms 的界面 dll 文件,接着将由 GTK 项目,假定命名为 B 项目,作为最终原生控件支持,被 Xamarin.Forms 的界面 dll 所映射,因此刚才新建的 GTK 项目就是最终入口项目,应用程序由他启动

在创建的控制台项目里面,编辑 csproj 文件,右击刚才创建的控制台项目,点击工具,点击编辑文件

修改 csproj 文件为下面内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <ProduceReferenceAssembly>true</ProduceReferenceAssembly>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>portable</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Xamarin.Forms" Version="4.8.0.1364" />
    <PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
  </ItemGroup>
</Project>

有小伙伴说,在 Windows 下,用 VS 新建一个 Xamarin.Forms 项目之后,再拷贝到 UOS 上,也是可以的,但是有一点需要注意的是不能拷贝 binobj 文件夹过去,原因是在 obj 文件夹存放了很多依赖本机电脑的文件夹绝对路径的文件,如 nuget 还原里面的 project.assests.json 文件将会包含 fallback 路径,如果拷贝到 Linux 下的系统,也许会看到如下提示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error MSB4018 The "ResolvePackageAssets" task failed unexpectedly. NuGet.Packaging.Core.PackagingException: Unable to find fallback package folder 'C:\ProgramData\Xamarin\NuGet\'

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error MSB4018 The "ResolvePackageAssets" task failed unexpectedly. NuGet.Packaging.Core.PackagingException: Unable to find fallback package folder 'C:\Program Files (x86)\Xamarin\NuGet\'

如果忘了这一点复制了 obj 文件夹,可以在 UOS 这个 Linux 系统下删除 obj 文件夹,解决 Xamarin Forms 在 Linux 系统构建失败的问题

先忽略从Windows等系统创建好了 Xamarin Forms 的方法,咱就在 UOS 上一步步创建

删除 A 项目,也就是安装了 Xamarin Forms 的控制台项目,的 Program.cs 文件

然后选择新建一个空 xml 文件,创建完成之后修改命名为 App.xaml 文件,同时创建一个空类叫 App.xaml.cs 文件

这两个文件将表示 Xamarin Forms 项目的起始,也就是在 Xamarin 层的启动入口。在使用 Xamarin.Forms 的 GTK 应用,有两层入口,第一层是本机程序的入口,也就是 B 项目的 Program 文件的 Main 方法入口,第二层就是 Xamarin.Forms 的 App 入口。应用程序启动的时候,先进入第一层入口,在第一层入口初始化本机相关的进程,然后进入第二层入口,在第二层入口初始化 Xamarin 应用

在 App.xaml 添加下面代码,下面代码的 x:Class="WokemhelurnawgelrallKearlallidallla.App" 其实 WokemhelurnawgelrallKearlallidallla 就是项目名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="WokemhelurnawgelrallKearlallidallla.App">
    <Application.Resources>

    </Application.Resources>
</Application>

其实上面的 App.xaml 是空代码,有意义的代码放在 App.xaml.cs 请看代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Xamarin.Forms;

namespace WokemhelurnawgelrallKearlallidallla
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            MainPage = new MainPage();
        }
    }
}

上面代码的核心就是在构造方法调用 InitializeComponent 方法,然后设置主页面

接着咱需要新建一个主界面,新建 MainPage 的 xml 文件,然后修改命名为 MainPage.xaml 文件

然后填写界面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="WokemhelurnawgelrallKearlallidallla.MainPage">

    <StackLayout>
        <Label Text="Welcome to Xamarin.Forms!" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" />
    </StackLayout>

</ContentPage>

还请小伙伴先不要改多内容哈

接着新建 MainPage.xaml.cs 文件,添加下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.ComponentModel;
using Xamarin.Forms;

namespace WokemhelurnawgelrallKearlallidallla
{
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
    }
}

现在新建了 App 应用和 MainPage 一个界面,但是还需要一个 AssemblyInfo.cs 文件,设置程序集特性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]

这样一个简单的 Xamarin Forms 项目就完成了,设置 GTK 项目,也就是 B 项目,引用 Xamarin Forms 项目,也就是 A 项目

但是此时将会发现构建不通过,因为 B 项目,也就是 GTK 项目没有引用足够的 NuGet 包。给 B 项目添加以下 NuGet 库

  • OpenTK
  • Xamarin.Forms
  • Xamarin.Forms.Platform.GTK

接着打开 B 项目的 Program.cs 文件,在 Main 方法添加如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            Gtk.Application.Init();
            Forms.Init();
 
            var app = new App();
            var window = new FormsWindow();
            window.LoadApplication(app);
            window.SetApplicationTitle("lindexi");
            window.Show();
            Gtk.Application.Run();

注意在编辑器里面添加 using 引用

然后删除除了 Program.cs 的其他 cs 代码文件

此时 B 项目,构建之后可以看到如下界面

当前的项目大概如下

本文没有给大家一个简单的方法,主要是让大家可以了解更多内容

官方文档请看 GTK# Platform Setup - Xamarin

尽管官方文档里面说的是预览版,但是经过了2年的开发,现在不能的支持的点很少。另外,这里的 GTK 支持的代码都是完全开源的,刚好我改的动,所以用起来也不慌


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#一分钟浅谈:Xamarin 移动应用开发
随着移动设备的普及,移动应用开发成为了软件开发领域的一个重要分支。Xamarin 是一个基于 .NET 平台的跨平台移动应用开发框架,允许开发者使用 C# 语言编写一次代码,即可在 iOS、Android 和 Windows Phone 上运行。本文将从基础概念入手,逐步深入探讨 Xamarin 开发中的常见问题、易错点及如何避免,并通过代码案例进行解释。
Jimaks
2024/11/19
4660
Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
Xamarin.Forms 是一个跨平台的、基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面。Xamarin.Forms 通过使用平台的原生控件来渲染用户界面,使用 Xamarin.Forms 的 App在外观上与平台完全一致。通过本文您可以快速了解如何使用 Xamarin.Form 来进行应用程序的开发。 简介 Xamarin.Forms可以帮助开发人员快速的构建跨平台的UI,通过一次编码,生成多平台界面。如果你做的工作涉及到三个平
葡萄城控件
2018/01/10
13.7K0
Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
.NET MAUI:跨平台应用开发的全方位指南
随着技术的不断发展和移动设备的普及,应用程序开发者面临着一个挑战:如何在不同的设备和操作系统上提供一致的用户体验?跨平台开发成为了解决这一挑战的关键技术之一,而微软推出的 .NET MAUI(Multi-platform App UI)就是其中的一个重要工具。本文将深入探讨 .NET MAUI 的特点、架构、使用场景以及开发实战,帮助开发者全面掌握这一跨平台应用开发框架。
Michel_Rolle
2024/09/30
3K0
3. 单页App
上一篇文章我们创建了 Xamarin 应用程序,当我们创建完应用程序后 VS 2019 帮我们生成了一个名为 MainPage 的 xaml 文件,这个文件在当前项目中是仅有的页面,我们称这个应用程序称为 单页应用程序 。下面我们就修改一下上一篇文章所创建的应用程序。首先我们打开 MainPage.xaml 文件,将模板中的代码修改为如下形式:
喵叔
2020/09/08
1.4K0
3. 单页App
dotnet 融合 Avalonia 和 UNO 框架
现在在 .NET 系列里面,势头比较猛的 UI 框架中,就包括了 Avalonia 和 UNO 框架。本文将告诉大家如何尝试在一个解决方案里面融合 Avalonia 和 UNO 两个框架,即在一个进程里面跑起来两个框架
林德熙
2024/06/23
4961
dotnet 融合 Avalonia 和 UNO 框架
C#使用Xamarin开发可移植移动应用(1.入门与Xamarin.Forms页面),附源码
GuZhenYin
2018/01/04
6K0
C#使用Xamarin开发可移植移动应用(1.入门与Xamarin.Forms页面),附源码
Xamarin Forms WPF 干掉默认的窗口导航条
在创建默认的 Xamarin Forms WPF 应用,将和 UWP 应用的界面不相同,在 WPF 项目会显示顶部蓝色的一条,看起来不好看,那么可以如何干掉他
林德熙
2020/08/11
1.5K0
Xamarin Forms WPF 干掉默认的窗口导航条
C#一分钟浅谈:Xamarin 移动应用开发
随着移动设备的普及,移动应用开发成为了软件开发领域的一个重要分支。Xamarin 是一个基于 .NET 平台的跨平台移动应用开发框架,允许开发者使用 C# 语言编写一次代码,即可在 iOS、Android 和 Windows Phone 上运行。本文将从基础概念入手,逐步深入探讨 Xamarin 开发中的常见问题、易错点及如何避免,并通过代码案例进行解释。
Jimaks
2024/11/22
1.1K0
C#一分钟浅谈:Xamarin 移动应用开发
移动开发(五):.NET MAUI中自定义主题设置
今天给大家分享.NET MAUI应用中如何自定义主题,提升APP本身个性化设置的能力,让你开发的APP更具有吸引力。感兴趣的朋友可以来学习一下!
小明互联网技术分享社区
2024/08/11
4450
移动开发(五):.NET MAUI中自定义主题设置
VS2022 MAUI Hello World——Windows平台及Android平台效果
微软的Visual Studio 2022在11月8号已发布,除了.Net6,改为64位的应用程序,将不再局限于主进程 devenv.exe 的 4Gb 内存限制,还有就是微软的跨平台框架MAUI来了。由于工作中出差,也是在抽空的时间赶紧下载体验了一下。
Vaccae
2021/11/17
5.9K0
Windows 8.1 应用再出发 - 创建我的第一个应用
转眼间Windows 8.1已经发布了四个多月,之前因为开发需要对Windows 8.1新特性进行过零散的学习和使用,一直没有静下心来系统的学习过。近日部门有几名新同事加入,需要进行Windows 商店应用开发的培训,所以借这个机会,重新梳理一下Windows 8.1 应用开发的知识。闲言碎语不多讲,接下来开始第一站,创建第一个应用。 首先我们看一下开发环境要求:Windows 8.1 + Visual Studio 2013 紧接着我们新建一个Windows 8.1 商店应用的项目,起名为HelloWor
Shao Meng
2018/04/28
8070
Windows 8.1 应用再出发 - 创建我的第一个应用
Xamarin 学习笔记 - Page(页面)
在之前的章节,我讲解了如何为Android或者iOS应用程序开发准备环境以及Layout布局的一些基本概念。
葡萄城控件
2018/08/09
5K0
Xamarin 学习笔记 - Page(页面)
C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件..很很很很重要..),附源码
GuZhenYin
2018/01/04
2.5K0
C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件..很很很很重要..),附源码
C# 一分钟浅谈:MAUI 跨平台移动应用开发
这里推荐一篇实用的文章:《智能食品消费行为分析:基于Python与深度学习的实现》,作者:【Echo_Wish】。
Jimaks
2024/11/18
3020
Xamarin Forms 进度条控件
本文翻译:http://xamlnative.com/2016/04/14/xamarin-forms-a-simple-circular-progress-control/ 里面都是胡说的,如果看不懂可以联系邮箱 源代码:https://github.com/billreiss/xamlnative/tree/master/XamarinForms/CircularProgress 最近作者需要做一个简单的圆形的等待控件在一个Xamarin Forms应用,效果可以看
林德熙
2018/09/18
1.2K0
Xamarin Forms 进度条控件
dotnet 在 UOS 国产系统上使用 MonoDevelop 创建 GTK 全平台带界面应用
本文告诉大家如何在 UOS 国产系统上开始使用 MonoDevelop 开发,通过创建 GTK# 应用,进入界面开发的第一步
林德熙
2020/09/02
9660
用 WiX 制作安装包:制作 WPF 安装包界面(入门篇)
本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。
walterlv
2023/10/23
1.3K0
用 WiX 制作安装包:制作 WPF 安装包界面(入门篇)
WPF 已知问题 dotnet 6 设置 InvariantGlobalization 之后将丢失默认绑定转换导致 XAML 抛出异常
在设置了 InvariantGlobalization 为 true 之后,将会发现原本能正常工作的 XAML 可能就会抛出异常。本文将告诉大家此问题的原因
林德熙
2023/04/07
5830
WPF 已知问题 dotnet 6 设置 InvariantGlobalization 之后将丢失默认绑定转换导致 XAML 抛出异常
张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )
  所谓 UWP 样式的汉堡菜单,我曾在“张高兴的 UWP 开发笔记:汉堡菜单进阶”里说过,也就是使用 Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色的矩形用来表示
张高兴
2018/05/18
4.9K0
Xamarin Forms 构建 WPF 版项目失败提示 XamlC error XFC0000 错误
在 Xamarin Forms 从 4.7 到 4.8.0.1560 版本,在 Xamarin Forms 构建 WPF 版项目也许会提示 XamlC error XFC0000 : Cannot resolve type “Application” 构建失败
林德熙
2022/08/12
2K0
Xamarin Forms 构建 WPF 版项目失败提示 XamlC error XFC0000 错误
推荐阅读
相关推荐
C#一分钟浅谈:Xamarin 移动应用开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档