Avalonia开发小结(持续更新)
官網:
https://avaloniaui.net/
源碼:
https://github.com/AvaloniaUI/Avalonia
討論版:
https://gitter.im/AvaloniaUI/Avalonia
最近因為要研究跨平臺開發,不可避免地順帶了解了Linux系統,把聯想平板電腦裝成了Ubuntu 20.04系統。
就像Linux系統一樣,目前對它的了解是,將就著能用,但不是很好用。期間會遇到奇奇怪怪的各種小問題。
就像我的平板,外接的鍵盤帶觸摸板。因為打字的時候很容易觸碰到觸摸板,所以想把它禁用掉。但是這個在Windows系統很容易解決的小問題,可是在Linux下面可能根本無法解決,或者無法找到解決的方法。
但是這種小問題,其實又是非常影響平常的使用體驗的。
這幾天,把原來在Windows平板上用WPF開發的一些小程序都移植成了Avalonia版本。幾個應用折騰下來,感覺還行,做東西還算是方便的,雖然跟WPF比可能還是有很大差距。
本身因為還沒有正式發布,所以肯定還會存在一些問題。
但開發過程中遇到的很多問題,其實很多都是對Avalonia平臺和Linux操作系統不是很熟悉。
就像游戲打怪一樣,WPF換到了Avalonia,一些經驗需要重新積累,其實還是需要幾個項目做下來,慢慢地知道了哪些能做,哪些不能做。然后慢慢地擴展功能,積累新經驗。
最關鍵的是,.net平臺的跨平臺開發,除了Avalonia之外,也沒有更好的選擇。作為用慣了WPF開發的碼農來說,Avalonia應該是目前能找到的最好的代替品。
這幾天都是在Ubuntu上用Rider來開發,比VS Code應該要好用一點,但是Rider的很多操作都跟VS不一樣,也是一個慢慢熟悉的過程。
網上能找到的資料不多,但是很保貴。初次接觸這個平臺可以先看一下官網的幫助文檔。
遇到問題,我一般會去項目的Github的issues搜索一下,可能會有線索。
剩下的百度谷歌,各種想辦法。
再不行,看Avalonia的源碼,看能不能解決。
目前不支持的功能
托盤圖標
沒有ToolBar功能
不支持全局熱鍵
不支持在前面XAML界面注冊事件
目前遇到無法解決的問題
在部分機子上,打開OpenFileDialog時,會卡UI,軟件無響應。
TextBox中	制表符顯示亂碼的問題,目前還不知道怎么解決。
一些缺點
生成的軟件包會比較大,因為要帶個各個系統的各種類庫。
編輯器推薦
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.
在現在用的Ubuntu 20.04操作系統上,其實也遇到這個font family的問題,通過網上提供的方法,是可以解決和正常運行的。
不過盡量先不要用iconfont,用了以后在Windows系統下可能會沒有問題,但是在報字體錯誤的系統下,可能要修改一下那個自定義的字體控制的類。
因為我現在還不知道怎么改,所以采用了最省事的方法,放棄使用iconfont。
Avalonia的應用可以打包成deb安裝包。也可以基于軟件包設置桌面圖標,操作方法參考:
Ubuntu系統下為Avalonia應用創建桌面圖標 - wzwyc - 博客園
https://www.cnblogs.com/wzwyc/p/14820893.html
常見問題解決
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設置.net core程序開機自啟動
在/etc/systemd/system/ 目錄下創建.service文件。
UploadServer.service文件:
[Unit] Description=UploadServer After=network.target [Service] WorkingDirectory=/www/wwwroot/db.cnsos.net/UploadServer/UploadServer/bin/Debug/netcoreapp3.1 ExecStart=/usr/bin/dotnet /www/wwwroot/db.cnsos.net/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.”的錯誤。應該是跟字體有關系。網上找了一下資料。可以參照以下網址的方法來嘗試解決。
https://www.cnblogs.com/joyandjoys/p/14346935.html
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")
總結
以上是生活随笔為你收集整理的Avalonia开发小结(持续更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: QTcpSocket 对连接服务器中断的
- 下一篇: 无法获取未定义或 null 引用的属性“
