wpf 在没有自定义字体的计算机上,如何才能使自定义字体在最终装配中仍然有效?

qfe3c7zg  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(141)

我有一个WPF项目,一切都在Visual Studio和bin Builds. x1c 0d1x中运行良好,但当我为Win x64创建一个独立的构建时(dotnet publish -r win-x64 -c Release -o ./publish)并在没有此类字体的另一台计算机上运行该项目,然后一切都变成了一堆乱七八糟的标准Arial字体。

我应该怎么做才能让自定义字体在没有这种字体的计算机上的最终组装中仍然工作?

**.人居署项目:

<ItemGroup>    
    <Resource Include="Resources\Fonts\Murder.ttf"/>
    <Resource Include="Resources\Fonts\Shayne.ttf"/>
  </ItemGroup>

资源字典:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <FontFamily x:Key="Murder">pack://application:,,,/GameLauncher;component/Resources/Fonts/#Murder</FontFamily>
    <FontFamily x:Key="BuxtonSketch">pack://application:,,,/GameLauncher;component/Resources/Fonts/#Shayne</FontFamily>

    <Style x:Key="CustomFont_Murder" TargetType="{ x:Type TextBlock}">
        <Setter Property="FontFamily"  Value="{StaticResource Murder }">
            
        </Setter>
    </Style>

    <Style x:Key="CustomFont_Buxton" TargetType="TextBlock">
        <Setter Property="TextElement.FontFamily" Value="Buxton Sketch">

        </Setter>
    </Style>

</ResourceDictionary>

App.xaml:

<Application.Resources>
        
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Fonts.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

    </Application.Resources>

MainWindow.xaml:

<TextBlock x:Name="DownloadProgressText" VerticalAlignment="Top" HorizontalAlignment="Left" TextWrapping="Wrap" FontFamily="{StaticResource BuxtonSketch}"
                   FontSize="20" Foreground="White" Width="970" Margin="15,244,0,0" Grid.Row="1" Grid.ColumnSpan="2" Height="156"><Run Text="Text Custom Font Buxton"/><LineBreak/><Run/><LineBreak/>
            <Run Text="This article is among the articles of the labor law whose violation is punishable by the provisions of article 174 of the labor law which states that offenders who violate 
                 article 38 of the labor law “will be condemned to not only end the discrimination so imposed but also to compensate for the wrong done to worker(s) in each case by the deadline 
                 that the court will decide in consultation [...] with the representative of the Ministry of Labor and Social Affairs”. "/></TextBlock>
mkh04yzy

mkh04yzy1#

我碰巧有一些真实的世界的应用程序可以做到这一点。
您需要将ttf文件与游戏exe沿着交付。
然后可以将它们作为字体系列加载。
加载这样的字体家族时需要使用绝对地址。wpf中有一个错误,如果使用相对地址会造成内存泄漏。
我会解释我在我们的游戏编辑器做什么,然后你可以选择你喜欢的。
我允许用户在运行时切换字体,他们可以选择维多利亚或现代主题,因此字体基本上。
我有一个资源字典,我在app.xaml中将它与键控字体家族合并,最初使用常规的windows字体。
我有每个文本使用的动态资源。
ttf字体放在一个字体文件夹里,我知道里面有什么,所以我可以用它们的硬编码列表来工作。
ttf文件的属性设置为content,如果更新则复制。当我编译时,它们出现在我的bin中,在一个fonts文件夹中。
在显示主窗口之前,我需要用我的字体替换ttf文件中的字体,所以在app.xaml.cs中,我有一个Application_Startup方法显式地更新主窗口,在显示它之前,我调用我的字体加载方法。
代码如下所示:

public static class VictorianFonts
{
    private static string fontFolder = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Fonts", "#");
    private static List<Afont> fonts = new List<Afont>
        {
            new Afont{ResName="XXX", FontName="XXX XX XXXX" },
            new Afont{ResName="YYY", FontName="YYY yy YYYY" }
        };

    public static void Load()
    {
        foreach (var fnt in fonts)
        {
            Application.Current.Resources.Remove(fnt.ResName);
            var ff = new FontFamily(fontFolder + fnt.FontName);
            Application.Current.Resources.Add(fnt.ResName, ff);
        }
    }

    private record Afont
    {
          public string ResName { get; set; }
          public string FontName { get; set; }
    }
}

查找exe的运行位置,然后在该文件夹中的字体文件夹中查找字体。
我有一个VictorianResources资源字典,它将被合并到app.xaml中。

<FontFamily x:Key="XXXX">SegoeUI</FontFamily>
 <FontFamily x:Key="YYYY">Gabriola</FontFamily>

我有一些代码,当用户改变主题时,它会切换到其他资源。

public bool VictorianStyle
    {
        get { return victorianStyle; }
        set
        {
            if (value == true)
            {
                ResourceDictionary rd = new ResourceDictionary { Source = new Uri("pack://application:,,,/UILib;component/Resources/VictorianStyle.xaml", UriKind.Absolute) };
                Application.Current.Resources.MergedDictionaries.Add(rd);
                VictorianFonts.Load();
            }
            victorianStyle = value;
            RaisePropertyChanged();
        }
    }

相关问题