Avalonia开发⼩结(持续更新)
官⽹:
源码:
最近因为要研究跨平台开发,不可避免地顺带了解了Linux系统,把联想平板电脑装成了Ubuntu 20.04系统。
就像Linux系统⼀样,⽬前对它的了解是,将就着能⽤,但不是很好⽤。期间会遇到奇奇怪怪的各种⼩问题。
就像我的平板,外接的键盘带触摸板。因为打字的时候很容易触碰到触摸板,所以想把它禁⽤掉。但是这个在Windows系统很容易解决的⼩问题,可是在Linux下⾯可能根本⽆法解决,或者⽆法到解决的⽅法。
但是这种⼩问题,其实⼜是⾮常影响平常的使⽤体验的。
这⼏天,把原来在Windows平板上⽤WPF开发的⼀些⼩程序都移植成了Avalonia版本。⼏个应⽤折腾下来,感觉还⾏,做东西还算是⽅便的,虽然跟WPF⽐可能还是有很⼤差距。
本⾝因为还没有正式发布,所以肯定还会存在⼀些问题。
但开发过程中遇到的很多问题,其实很多都是对Avalonia平台和Linux操作系统不是很熟悉。
就像游戏打怪⼀样,WPF换到了Avalonia,⼀些经验需要重新积累,其实还是需要⼏个项⽬做下来,慢慢地知道了哪些能做,哪些不能做。然后慢慢地扩展功能,积累新经验。
最关键的是,平台的跨平台开发,除了Avalonia之外,也没有更好的选择。作为⽤惯了WPF开发的码农来说,Avalonia应该是⽬前能到的最好的代替品。
这⼏天都是在Ubuntu上⽤Rider来开发,⽐VS Code应该要好⽤⼀点,但是Rider的很多操作都跟VS不⼀样,也是⼀个慢慢熟悉的过程。
⽹上能到的资料不多,但是很保贵。初次接触这个平台可以先看⼀下官⽹的帮助⽂档。
遇到问题,我⼀般会去项⽬的Github的issues搜索⼀下,可能会有线索。
剩下的百度⾕歌,各种想办法。
再不⾏,看Avalonia的源码,看能不能解决。
⽬前不⽀持的功能
托盘图标
没有ToolBar功能
不⽀持全局热键
不⽀持在前⾯XAML界⾯注册事件
⽬前遇到⽆法解决的问题
TextBox中\t制表符显⽰乱码的问题,⽬前还不知道怎么解决。
⼀些缺点
⽣成的软件包会⽐较⼤,因为要带个各个系统的各种类库。
编辑器推荐
Visual Studio 2019
需要安装⼀个插件,但是XAML界⾯下,代码提⽰功能⽐较弱,基本上算没有,写起来不是很⽅便。
JetBrains Rider
⽬前最新版本是2021版本,本⾝是商⽤,可以试⽤30天。XAML的编辑提⽰功能会⽐VS2019要好,不过代码调试有时候没VS2019⽅便,可以两个IDE结合起来使⽤。
如果是在Linux系统下开发,因为没有VS编译器可⽤,感觉JetBrains Rider会是最好的选择,相⽐较VS Code,集成度会更⾼,代码提⽰等⽅⾯都会做得更好⼀点。
系统测试情况
⽬前试了⼀下,能够正常运⾏的系统,除了Windows系统外,流⾏的Ubuntu,Centos,Redhat这些系统应该都没啥问题。
国产的麒麟系统,之前有同事在中标麒麟上跑成功过,不过是默认的HelloWord应⽤。
后⾯我在优麒麟上也是运⾏成功过,但是复杂⼀点的应⽤,能正常编译,但是运⾏的时候会报错:Default font family name can't be null or empty.linux系统是哪个
在现在⽤的Ubuntu 20.04操作系统上,其实也遇到这个font family的问题,通过⽹上提供的⽅法,是可以解决和正常运⾏的。
不过尽量先不要⽤iconfont,⽤了以后在Windows系统下可能会没有问题,但是在报字体错误的系统下,可能要修改⼀下那个⾃定义的字体控制的类。
因为我现在还不知道怎么改,所以采⽤了最省事的⽅法,放弃使⽤iconfont。
Avalonia的应⽤可以打包成deb安装包。也可以基于软件包设置桌⾯图标,操作⽅法参考:
Ubuntu系统下为Avalonia应⽤创建桌⾯图标 - wzwyc - 博客园
常见问题解决
1、Ubuntu系统下TextBox中⽂显⽰乱码
貌似Avalonia必须指定⼀下当前窗体的字体,不然中⽂就是会显⽰乱码,之前是直接设置成“Microsoft YaHei”,会导致Ubuntu系统下不到相应的字体:
private static string GetPlatformFontFamily()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
return"Microsoft YaHei";
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
return"Menlo"; //换成OSX下的中⽂字体
}
else
{
return"Noto Sans CJK SC";
}
}
2、ToolTip的显⽰
在要显⽰ToolTip的控件上加上附加属性:
ToolTip.Tip="Tip内容"
3、Ubuntu设置 core程序开机⾃启动
在/etc/systemd/system/ ⽬录下创建.service⽂件。
UploadServer.service⽂件:
[Unit]
Description=UploadServer
After=network.target
[Service]
WorkingDirectory=/www/wwwroot/dbsos/UploadServer/UploadServer/bin/Debug/netcoreapp3.1
ExecStart=/usr/bin/dotnet /www/wwwroot/dbsos/UploadServer/UploadServer/bin/Debug/netcoreapp3.1/UploadServer.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
SyslogIdentifier=UploadServer
[Install]
WantedBy=multi-user.target
3、UploadServer.service⽆法正常启动
发现程序在Ubuntu的终端下⽤dotnet run可以正常启动和运⾏,但是设置为service以后,就是⽆法正常使⽤。
通过下⾯的命令看了⼀下:
sudo journalctl -f -u FileServer.service
发现服务在不停地启动和停⽌。
看了⼀下代码,Main函数的未尾使⽤了Console.ReadLine();
换成:
while (true)
{
Thread.Sleep(1000);
}
应该是service会⾃动跳过Console.ReadLine(),然后程序就结束了,然后服务本⾝设置了⾃动重启,所以不停地停⽌和重启。
3、Ubuntu系统下路径不正常的问题
程序在Windows系统下测试良好,但是在Ubuntu系统上却⽆法正常运⾏,看了⼀下,是⽂件路径的问题。
因为客户端在Windows下运⾏的,客户端上传的路径⾥的“\”需要换成“/”。写了⼀个路径转换函数:
public static string ChangePath(string path)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
path = path.Replace("\\", "/");
if (path.StartsWith("/"))
path = path.Substring(1);
return path;
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
path = path.Replace("/", "\\");
if (path.StartsWith("\\"))
path = path.Substring(1);
return path;
}
return path;
}
另外,在使⽤Path.Combine(path1,path2)进⾏路径组合的时候,path2不能以"\"或“/”开头,不然的话,路径会组合失败。
3、“Default font family name can't be null or empty.”错误问题
部分Linux操作系统下,能够正常编译,但是⽆法启动应⽤,会报“Default font family name can't be null or empty.”的错误。应该是跟字体有关系。⽹上了⼀下资料。可以参照以下⽹址的⽅法来尝试解决。
4、第三⽅的MessageBox.Avalonia控件有点问题,会导致应⽤崩溃退出。
初步判断是因为窗⼝的图标引起的,⽽且这个图标不设置也不⾏。
最新版本已经没有问题。
var msBoxStandardWindow = MessageBox.Avalonia.MessageBoxManager.GetMessageBoxStandardWindow(new MessageBoxStandardParams
{
ButtonDefinitions = ButtonEnum.Ok,
ContentTitle = "提⽰",
ContentMessage = "请输⼊⽹址",
Icon = Icon.Info,
Style = Style.UbuntuLinux,
WindowStartupLocation = WindowStartupLocation.CenterOwner,
FontFamily = "Microsoft YaHei",
});
await msBoxStandardWindow.Show(App.GetActiveWindow());
不过这个对话框控件容易出现⼀些问题,类似中⽂显⽰乱码等等问题,其实⾃⼰写⼀个简单的对话框窗体也是不错的选择。
5、Ubuntu系统下,从IDE上Debug可以正常运⾏,但是通过系统的桌⾯图标⽆法打开。
试了⼀下,⽤.desktop⾥的路径直接在终端⾥⾯运⾏,也是⽆法正常运⾏的。在终端上⾯输出了⼀些错误信息。看了⼀下,配置⽂件的路径,⽤的是相对路径。
把它改成下⾯的形式,应⽤就能正常打开了。
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Formats/AppConfig")
6、在部分机⼦上,打开OpenFileDialog时,会卡UI,软件⽆响应。
在Main⽅法上加上[STAThread] 的标签。如下所⽰:
internal 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.
[STAThread]
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<App>()
.UsePlatformDetect()
.LogToTrace();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。