如何有效地持久化一个 .Net 字体对象?

6

使用情况:用户对设计表面上的对象进行字体自定义,我需要将其加载/保存到我的数据存储中。例如,需要持久化设置如粗体、斜体、大小、字体名称等。

是否有一种简单(且可靠)的机制可以将字体对象的字符串表示转换/读回(在这种情况下,我只需要一个属性)?还是多个属性结合自定义逻辑是正确的选项?

3个回答

10

使用TypeConverter

Font font = new Font("Arial", 12, GraphicsUnit.Pixel);

TypeConverter converter = TypeDescriptor.GetConverter(typeof (Font));

string fontStr = converter.ConvertToInvariantString(font);

Font font2 = (Font) converter.ConvertFromString(fontStr);

Console.WriteLine(font.Name == font2.Name); // prints True

如果您想使用XML序列化,可以创建字体类包装器,其中将存储一些字体属性的子集。

注意(Gishu) - 永远不要直接访问类型转换器。相反,通过使用TypeDescriptor来访问适当的转换器。非常重要 :)


太好了!..和广告一样有效-谢谢aku。我会投票让你更接近5K的标记 :) - Gishu
1
我认为ConvertFromInvariantString()应该作为ConvertToInvariantString()的对应方法使用(而不是上面示例中看到的ConvertFromString())。 - miroxlav

0
你需要哪种数据存储来持久化它?如果只是用户设置,可以将字体对象序列化到二进制文件或 XML 文件中(如果想直接编辑配置文件的话)。序列化命名空间(System.Xml.Serialization 和 System.Runtime.Serialization)提供了所有工具,无需编写自定义代码即可完成此操作。
MSDN 网站上关于 XML 序列化的文章:.NET Framework 中的 XML 序列化 [编辑] 看来字体对象不可序列化。抱歉。

字体对象不可序列化。 - aku

0
在我正在工作的项目中,我选择了多个属性。
我通过分解字体的名称、大小、样式和单位并将这些值持久化到数据库表中来保存字体。
一旦检索到这些值,按需重新创建字体非常容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接