2

解决Avalonia 11.X版本的中文字体问题 - yunxizfj

 1 year ago
source link: https://www.cnblogs.com/yunxizfj/p/17617992.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

解决Avalonia 11.X版本的中文字体问题

网上搜索的方法使用接口“IFontManagerImpl”这个方法目前只能用于Avalonia 10.X版本,因为11版本后官方把这个接口的成员都设置成了非plubic,所以之前的版本解决办法用不上了,经过搜索github的官方那边的问题集锦,要解决解决Avalonia 11.X版本的中文字体问题有2个思路:

1.在程序里面嵌入TTF字体文件 2.把字体文件安装到linux系统,设置代码使用

这里我成功了第一种方法,运行环境:银河麒麟v10+net6.0+Avalonia 11.0.2+微软雅黑字体

第一步,创建项目:net6.0+Avalonia 11.0.2,项目文件内容如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <!--Avalonia doesen't support TrimMode=link currently,but we are working on that https://github.com/AvaloniaUI/Avalonia/issues/6892 -->
    <TrimMode>copyused</TrimMode>
    <BuiltInComInteropSupport>true</BuiltInComInteropSupport>
  </PropertyGroup>
  <ItemGroup>
    <None Remove=".gitignore" />
    <None Remove="Assets\Fonts\msyh.ttf" />
  </ItemGroup>
  <ItemGroup>
    <AvaloniaResource Include="Assets\Fonts\msyh.ttf" />
  </ItemGroup>  
  <ItemGroup>
    <PackageReference Include="Avalonia" Version="11.0.2" />
    <PackageReference Include="Avalonia.Desktop" Version="11.0.2" />
      <PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.2" />
      <PackageReference Include="Avalonia.Themes.Simple" Version="11.0.2" />
      <PackageReference Include="Avalonia.Markup.Xaml.Loader" Version="11.0.2" />
      <PackageReference Include="Avalonia.ReactiveUI" Version="11.0.2" />
    <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
    <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.2" />
  </ItemGroup>
</Project>

第二步,在网上去搜索下载你所需的中文字体,我这用的微软雅黑字体,放入项目,然后设置为AvaloniaResource,可以参加第一步项目文件内容。

第三步,在App.axaml文件添加字体资源使用,直接用选择器选择窗体,就行了,参考如下代码:

<Application xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="Avalonia11Test.App">
    <Application.Styles>
        <!--<FluentTheme />-->
        <SimpleTheme />
        <Style Selector="Window">
            <Setter Property="FontFamily" Value="../Assets/Fonts/msyh.ttf#Microsoft YaHei"/>
        </Style>
    </Application.Styles>
</Application>

第三步,在主窗体随便整点中文的显示就行了,我这整点文本显示,参考如下代码:

<Window 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"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        x:Class="Avalonia11Test.MainWindow"
        Title="Avalonia11Test">
    <StackPanel>
        <CheckBox Name="cbtn" Content="Welcome to 阿威罗尼亚!" FontSize="20" />
        <Button  Click="Open" Content="打开" Width="100" Height="25"/>
        <StackPanel>
            <TextBlock Text="你好" FontWeight="Regular" FontSize="15"/>
            <TextBlock Text="你好" FontWeight="Bold"  FontSize="25"/>
            <TextBlock Text="你好" FontWeight="UltraBold"  FontSize="35"/>
        </StackPanel>
    </StackPanel>
</Window>

第四步,发布!我懒,我没在linux安装net sdk,所以我在这直接就选择文件夹发布,参数设置为独立框架+独立文件。

第五步,把文件复制到linux系统,根据官方的说法中文字体是来源于skia底层,所以uno也会出现,需要设置一下系统LC_CTYPE的变量,所以安装官方的指示,创建一个sh脚本,内容参考如下:

#!
export LC_CTYPE=en_US.UTF-8 && ./Avalonia11Test

最后,就把sh脚本使用sudo chmod提升一下权限,执行./你的sh 大功告成!

这是没有使用该方法直接执行的效果图:

30609-20230809205308132-810667126.png

这是使用了该方法的运行图:

30609-20230809205424715-1607114122.png
30609-20230809205507764-316087717.png

在国产系统上做开发,在当前QT大行其道的情况下,一个来自搞了很多年NET程序员的倔强,特别是JG行业


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK