C# WPF 如何从字节数组加载 FontFamily

作者:编程家 分类: arrays 时间:2025-10-16

# 使用C# WPF从字节数组加载FontFamily的方法

在C# WPF应用程序中,有时候我们可能需要动态加载字节数组中的字体文件,并将其应用于应用程序中的控件。这可以通过以下步骤实现,让我们一起来看看吧。

## 加载字节数组中的字体文件

要加载字节数组中的字体文件,我们首先需要将字节数组转换为字体对象。在WPF中,字体通常由`FontFamily`类表示。我们可以使用`PrivateFontCollection`和`FontFamily`类来实现这一点。以下是一个简单的例子:

csharp

using System;

using System.Drawing.Text;

using System.IO;

using System.Runtime.InteropServices;

using System.Windows;

using System.Windows.Media;

namespace WpfFontLoadingExample

{

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

// 从字节数组加载字体

byte[] fontData = File.ReadAllBytes("PathToYourFontFile.ttf");

FontFamily customFont = LoadFontFromByteArray(fontData);

// 应用字体到控件

textBlock.FontFamily = customFont;

}

private FontFamily LoadFontFromByteArray(byte[] fontData)

{

PrivateFontCollection privateFontCollection = new PrivateFontCollection();

// 分配内存并将字节数组复制到私有字体集合

IntPtr data = Marshal.UnsafeAddrOfPinnedArrayElement(fontData, 0);

privateFontCollection.AddMemoryFont(data, fontData.Length);

// 获取私有字体集合中的第一个字体

FontFamily fontFamily = new FontFamily(new Uri("pack://application:,,,/"), privateFontCollection.Families[0].Name);

// 释放内存

Marshal.FreeCoTaskMem(data);

return fontFamily;

}

}

}

## 从字节数组加载字体的关键步骤

上述代码中,我们定义了一个`LoadFontFromByteArray`方法,它接受一个字节数组作为参数并返回一个`FontFamily`对象。下面是这个方法的关键步骤:

1. 我们使用`PrivateFontCollection`类来创建一个私有字体集合。

2. 使用`AddMemoryFont`方法将字节数组中的字体数据添加到私有字体集合中。

3. 通过私有字体集合获取字体的名称,然后使用该名称创建一个新的`FontFamily`对象。

4. 最后,我们释放分配的内存,确保不会发生内存泄漏。

通过这些步骤,我们成功地将字节数组中的字体加载到`FontFamily`对象中,并应用于WPF控件。

这个方法对于需要动态加载字体并在应用程序中使用它们的场景非常有用。通过使用这种方法,我们可以实现更灵活和动态的字体管理。