wpf xaml突然不能自动补齐代码_Xaml+C#桌面客户端跨平台初体验

(给DotNet加星标,提升.Net技能)

转自:大头BigHeadcnblogs.com/Big-Head/p/12614118.html

前言

随着 .NET 5的到来,微软在 .NET跨平台路上又开始了一个更高的起点。

回顾.NET Core近几年的成果,可谓是让.NET重生了一次.

ASP .NET Core跨平台解决了Windows服务器昂贵的费用和不能长时间待机的问题,让Asp程序能够跑在Linux甚至Mac上。

从博客园里.NET分类可以看到,每天都可以涌现大批ASP .NET Core的技术文章,越来越多的开发者或者公司开始尝试这个船新的跨平台框架。

然鹅,ASP的跨平台是能够使用html作为UI,C#作为后台代码完成的,html本来就是原生支持跨平台的语言。如果要到达在客户端方面的跨平台,仍需要走很长一段路。

早些年的时候。微软使用钞能力收购了移动客户端跨平台开发的大佬Mono,并组建了新的Xamarin,一次开发就可以生成Android,iOS,UWP平台的App,但也仅仅停留在移动客户端跨平台。

同样在民间一些大佬的努力下,也创造出了很多PC跨平台的轮子

比如:Electron.Net,GTK#,Qt#等等,这些框架都是使用Html或者Mono平台的内容达到UI跨平台的,而今天我则要推荐一款新的跨平台方案AvaloniaUI。

准备

  • 一个Linux的机器

这里推荐使用windows 10下的linux子系统,可以快速的在windows上操作linux子系统的文件目录,用来快速上传编译的程序到linux。详细操作可以看这篇文章启用Windows10的Linux子系统并安装图形界面。

当然使用实体机,或者服务器都可以。总之最终目的就是有一个可以连接带图形化界面的Linux系统。

  • 安装.Net Core Runtime

微软官方给出了在Ubutnu安装.Net Core的方法,这里我以Ubuntu为例,其他发行版本使用对应的包管理命令

1、注册 Microsoft 密钥和源

wget https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb

2、安装.Net Core 3.1 Runtmime

sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-runtime-3.1

更多详情可参考Microsoft Docs :Ubuntu 19.04 包管理器 - 安装 .NET Core。

https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-package-manager-ubuntu-1904

  • 安装VS拓展

1d83d8814de7a48aca2f32bb01cdf0a0.png

如果VS拓展下载太慢,可以使用下面的网盘链接下载。

链接: https://pan.baidu.com/s/1sYnpC37IcH2VKQKjmqBALw 提取码: wyqn

  • WPF/UWP的经验

1、Xaml的语法

2、C#

3、最好了解MVVM模式或者ReactiveUI

Code

创建一个AvaloniaUI的项目

79ac2786205fa0e98bb66be2406c3196.png

了解WPF/UWP通知模式的童鞋可以使用MVVM

项目结构

1078d20d6821fa9c460be44865260721.png

和WPF/UWP很相似的结构,但是不同的是Program.cs被重写了

class Program 
{
// Initialization code. Don't use any Avalonia, third-party APIs or any
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
public static void Main(string[] args) => BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()=> AppBuilder.Configure()
.UsePlatformDetect()
.LogToDebug()
.UseReactiveUI();
}

MainWindow.Xaml

5825340838364dbd65bcadb11baf297d.png

可以说和WPF/Xaml大致一模一样了,但是体验不太好地就是在Xaml标签页的智能提示和显示内容体验,以及右侧的实时渲染窗口是一帧一帧地刷新整个页面。

ViewModel

422ba5b3c32d302a154538290ac70aee.png

Avalonia UI使用地是ReactiveUI来做的界面绑定和响应。和以往使用MVVMLight不同,绑定命令不用RelayCommand,而是直接在xaml绑定一个后台的方法名。

3962477d2b68b99f0ce1731047b372ad.png

c3099827346bb2f84a6749f35ab64b05.png

发布

编码完成在windows上测试通过之后,就可以把程序打包发到其他平台上测试了。这里以Linux为例:

Alt+B-->选择发布

9ce7ada31b1be9a7a0afc38a816dfbc7.png

3db2b618cd3cf1473b69cb6eb0bba315.png

根据目标平台选择配置保存。

点击发布,稍等片刻。

跨平台运行

以linux为例:

1、将Publish的文件夹上传到Linux上

2、找到对应的程序名(没有任何后缀),更改权限为”允许此文件作为程序运行“

3179fc1cc4c6dc430bd222f962d8aad2.png

3、双击运行,即可看到和Windows上一模一样的效果。

问题

由于AvaloniaUI不是微软官方出品,而是民间团队开发,且目前仍处于预览。我罗列一些自己遇到问题时的解决方案

1、尝试Nuget把AvaloniaUI的包更新到最新

2、保证开发的.netcore配置比运行环境的.net core版本低

0e920e456ad1aad9a25378c22af12a8a.png

39c9e2e74a4f167878fade8bca13e8a0.png

3、*字体渲染问题

这个问题是我遇到的最严重的问题,直接导致程序都不能渲染出来。如果有遇到这个问题的同学,可以首先在Program.cs下的Main函数里面加两行代码:

Console.WriteLine(SKTypeface.Default.FamilyName);
Console.WriteLine(SKTypeface.FromFamilyName("Sans").FamilyName);

然后在linux里使用控制台来运行程序,定位到程序目录,更改程序权限为可执行程序

chmod -x 程序名

运行程序

./程序名

如果出现权限不足的可以使用如下

chmod 777 程序名

如果运行程序后,控制台打印了NullRefrence的错误,那就是缺少默认字体。估计是AvaloniaUI的团队设置了程序的默认字体”Sans“。

只需要替换软件默认字体就可以了,这里我使用微软雅黑

<Applicationx:Class="AvaloniaTest.App"xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:AvaloniaTest">
<Application.DataTemplates>
<local:ViewLocator />
Application.DataTemplates>
<Application.Resources>
<FontFamily x:Key="yh">微软雅黑FontFamily>
Application.Resources>
<Application.Styles>
<StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml" />
<StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml" />
<Style Selector="Window">
<Setter Property="FontFamily" Value="{StaticResource yh}" />
Style>
Application.Styles>
Application>

并且需要在linux安装微软雅黑的字体

sudo apt-get install ttf-mscorefonts-installer

博客园之前也有一位大佬体验AvaloniaUI时候遇到字体的问题,可是他的树莓派是可以渲染出窗体只是没有文字,但是我测试了好几个发行版本都是窗体都不渲染。大家可以参考一下他的文章树莓派 Raspberry Pi 4,.net core 3.0 ,Avalonia UI 开发

运行效果

我尝试使用Face++的 API接口,测试写了一个有网络请求的抠图程序

Windows:

9b2d07b2a26447e4f190751c1924baa3.png

613c7ffda7b43e9db768e6b3a423f932.png

0331b27651b4dfb058808cf265680436.png

Linux:

65b2dfcd0f0fd6393ad946630f6cf5cf.png

a66f9cce9e66f539e739e6158e13e859.png

4bc0c9aff52152e565874fed460f0f44.png

其他

贴出一些参考网站给大家

  • 官网:http://avaloniaui.net/

  • GitHub:https://github.com/AvaloniaUI/Avalonia

  • 树莓派使用AvaloniaUI:https://www.cnblogs.com/drzhong/p/11678701.html

  • Mac使用AvaloniaUI:https://www.cnblogs.com/seamas/p/11245348.html

推荐阅读  点击标题可跳转

你所不知道的C#中的细节

.NET Core使用NPOI导出复杂美观的ExcelASP.NET Core AutoWrapper 自定义响应输出

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

30b2dd2a7a2c6438322605619811a606.png

好文章,我在看❤️

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

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

相关文章

vc6.0mfc中单选按钮如何分组_按钮系列02-搞定按钮和选框的14个秘诀

UI 界面当中&#xff0c;各种开关、按钮、选框控件是非常常见的组件&#xff0c;它们看起来不复杂&#xff0c;但是在实际使用的时候讲究非常之多&#xff0c;它们不仅关乎体验&#xff0c;而且涉及到一些界面逻辑问题。英文中的 「Toggle」一词&#xff0c;对应的是带有短柄的…

java某个类避免findbug检查_Findbug插件静态java代码扫描工具使用

本文转自http://blog.csdn.net/gaofuqi/article/details/22679609 感谢作者FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具。FindBugs通过检查类文件或 JAR文件&#xff0c;将字节码与一组缺陷模式进行对比从而发现代码缺陷&#xff0c;完成静态代码分析。FindBu…

4乘4方格走的路线_苏州周边4个冷门自驾游路线景点推荐

1.崇明东滩崇明东滩湿地公园有两大看点&#xff0c;一是看候鸟迁徙&#xff0c;二是看日出和星空。东滩湿地滩涂辽阔&#xff0c;低头是大片的芦苇&#xff0c;抬头是满天斑斓的云彩&#xff0c;顺着木栈道走在公园内&#xff0c;如与大自然融为一体&#xff0c;可360度将美景收…

Spring体系结构详解

Spring 框架采用分层架构&#xff0c;根据不同的功能被划分成了多个模块&#xff0c;这些模块大体可分为 Data Access/Integration、Web、AOP、Aspects、Messaging、Instrumentation、Core Container 和 Test。 Spring的体系结构如下图所示 图中包含了 Spring 框架的所有模块…

java对外查询接口注意的地方_Java接口注意点

1、接口可以多实现&#xff1a;一个实现类可以同时实现多个接口package com.qf.demo02_interface;//定义一种规则&#xff1a;interface A{public void testA();//public void fun();}//定义另一种规则interface B{public void testB();public void fun();}//实现类&#xff0c…

Spring目录结构和基础JAR包介绍

目前 Spring 框架的最新版本是 5.1.8&#xff0c;本教程是基于 Spring 的稳定版本 3.2.13 进行讲解的。读者可以通过网址 http://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 下载名称为 springframework-3.2.13.RELEASE-dist.zip 的压缩包。单击此…

自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析

Spring Validation概念在原先的编码中&#xff0c;我们如果要验证前端传递的参数&#xff0c;一般是在接受到传递过来的参数后&#xff0c;手动在代码中做 if-else 判断&#xff0c;这种编码方式会带来大量冗余代码&#xff0c;十分的不优雅。因此&#xff0c;推出了用注解的方…

mysql开源许可_为什么开源数据库改变许可证?

CockroachDB 是一个开源的分布式数据库&#xff0c;最近改变了代码授权&#xff0c;放弃了 Apache 许可证。一、CockroachDB 的许可证变更CockroachDB 以前的许可证是 Apache&#xff0c;代码托管在 GitHub&#xff0c;任何人都可以访问。现在的许可证改成了"商业源码许可…

Spring 依赖注入的实现

依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;和控制反转含义相同&#xff0c;它们是从两个角度描述的同一个概念。 当某个 Java 实例需要另一个 Java 实例时&#xff0c;传统的方法是由调用者创建被调用者的实例&#xff08;例如&#xff0c;使用 new…

java 静态对象语法_04.Java 语法

计算机基础知识表达式(expression)&#xff1a;Java中最基本的一个运算。比如一个加法运算表达式。12是一个表达式&#xff0c;ab也是。计算机内存的最小存储单元是字节(byte)&#xff0c;一个字节就是一个8位二进制数&#xff0c;即8个bit。它的二进制表示范围从00000000~1111…

Spring实例化Bean

在面向对象的程序中&#xff0c;要想调用某个类的成员方法&#xff0c;就需要先实例化该类的对象。在 Spring 中&#xff0c;实例化 Bean 有三种方式&#xff0c;分别是构造器实例化、静态工厂方式实例化和实例工厂方式实例化。 构造器实例化 构造器实例化是指 Spring 容器通…

Spring基于XML装配Bean

Bean 的装配可以理解为依赖关系注入&#xff0c;Bean 的装配方式也就是 Bean 的依赖注入方式。Spring 容器支持多种形式的 Bean 的装配方式&#xff0c;如基于 XML 的 Bean 装配、基于 Annotation 的 Bean 装配和自动装配等。 Spring 基于 XML 的装配通常采用两种实现方式&…

苹果php环境,苹果电脑安装PHP环境步骤-PHP问题

苹果电脑装置PHP环境步骤&#xff1a;一、起首咱们需求装置Homebrew二、终端输出饬令// 创立目次,假如你不创立过该目次sudo mkdir /usr/local/varsudo chmod 777 /usr/local/var//修正成你本人的用户名以及组,假如你不创立过该目次sudo mkdir /usr/local/sbin/sudo chown -R :…

Spring基于Annotation装配Bean

在 Spring 中&#xff0c;尽管使用 XML 配置文件可以实现 Bean 的装配工作&#xff0c;但如果应用中 Bean 的数量较多&#xff0c;会导致 XML 配置文件过于臃肿&#xff0c;从而给维护和升级带来一定的困难。 Java 从 JDK 5.0 以后&#xff0c;提供了 Annotation&#xff08;注…

swiper鼠标hover停止自动轮播_swiper滑块组件

相信大家在平常购物的时候都会看到轮播图&#xff0c;轮播图里面播放的是热门商品的信息。在小程序里面我们可以通过swiper滑动视图容器组件来实现&#xff0c;让我们一起来看下swiper组件都有哪些属性&#xff1a;我们看到可以通过一些属性给视图容器增加一些指示点&#xff0…

Spring自动装配Bean

除了使用 XML 和 Annotation 的方式装配 Bean 以外&#xff0c;还有一种常用的装配方式——自动装配。自动装配就是指 Spring 容器可以自动装配&#xff08;autowire&#xff09;相互协作的 Bean 之间的关联关系&#xff0c;将一个 Bean 注入其他 Bean 的 Property 中。 要使用…

java鬼剑士觉醒,DNF新觉醒装扮,男鬼剑士帅气无比!

在DNF这个游戏中&#xff0c;时装作为游戏的一大氪点&#xff0c;相信这几天的奇迹缝纫机活动也让大家了解到了时装到底多么的烧钱&#xff01;而也因为这次的活动&#xff0c;时装可以说达到了饱和状态了&#xff0c;估计短时间之内魔盒里不会再出现追忆时装了&#xff01;虽然…

Spring JDK动态代理

JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的。下面通过具体的案例演示 JDK 动态代理的使用。 1. 创建项目 在 MyEclipse 中创建一个名称为 spring 的 Web 项目&#xff0c;将 Spring 支持和依赖的 JAR 包复制到 Web 项目的 WEB-INF/lib 目录中&#xff0c;…

澄海哪里学机器人编程_少年学机器人编程

​当今社会&#xff0c;唯有能者居之&#xff0c;说的是有技能在手的人可以立足于职场&#xff0c;格物斯坦表示&#xff1a;现代化的教育方式有很多&#xff0c;其中有一种机器人编程教育模式&#xff0c;青少年们学好了&#xff0c;以后中考、高考核就业比同龄人更有优势了。…

Spring CGLlB动态代理

JDK 动态代理使用起来非常简单&#xff0c;但是有一定的局限性&#xff0c;这是因为 JDK 动态代理必须要实现一个或多个接口&#xff0c;如果不希望实现接口&#xff0c;则可以使用 CGLIB 代理。 CGLIB&#xff08;Code Generation Library&#xff09;是一个高性能开源的代码…