gpt4 book ai didi

c# - 如何处理 FormattedText/让 WPF 放弃 .TTF 文件?

转载 作者:太空宇宙 更新时间:2023-11-03 13:59:19 27 4
gpt4 key购买 nike

在我的 WPF 应用程序中,我有一个自定义的 Canvas 实现,我在其中使用指定的 .ttf 文件绘制了一些文本。 ttf 文件位于一个临时位置,以后可以将其删除。我的问题是,一旦我的文本呈现在 Canvas 上,ttf 文件似乎保持打开状态,并且在应用程序关闭之前无法删除。似乎是使字体文件保持打开状态的 FormattedText 实例。有没有人知道一种“处置”格式化文本的方法,或者以任何其他方式确保字体文件在呈现后关闭?

我的文字绘制代码:

public class MyCanvas : System.Windows.Controls.Canvas
{
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc);

// Some other drawing stuff...

FontFamily fontFamily = new FontFamily(fontUri);
Typeface typeFace = new Typeface(fontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
FormattedText formattedText = new FormattedText(chars, System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeFace, text.FontHeight, new SolidColorBrush(color));
dc.DrawText(formattedText, new Point(text.X + offsetX, text.Y + offsetY));
int textWidth = (int) formattedText.Width;
int textHeight = (int)formattedText.Height;

// Drawing continues...
}
}

注意:似乎我什至不必调用 DrawText 来锁定字体文件(尝试注释该行)。使用 formattedText 实例分配 textWidth 和 textHeight 变量足以让 WPF 保持文件打开。

更新:我一直无法解决这个问题,所以目前我正在使用一种解决方法,如果覆盖现有字体目录失败,则会创建一个新的临时字体目录。它有效,但我对必须这样做不是很满意,所以我仍然对如何解决这个问题的任何建议感兴趣。

最佳答案

也许它以某种方式与 Presentation Font Cache 相关,Presentation Font Cache 是一种运行以缓存字体数据结构以使 WPF 应用程序性能更好的服务....也许它使文件保持锁定状态。

尝试更改 Presentation Font Cache 服务,使其停止和禁用。运行您的应用程序,然后尝试查看是否可以删除字体文件。

如果确实是原因,那么禁用 Presentation Font Cache 并不是一个长期的解决方案。您可能会以编程方式停止并重新启动它……不确定这将如何影响其他正在运行的 WPF 应用程序。

有一个更明确的方法来查看谁锁定了文件,例如使用工具

一个可能的解决方案(绕过锁定文件的人)是将 .TTF 文件作为资源放在您的应用程序中,然后您可以让 WPF 担心如何管理和清理它。

链接:

更新:

你可以创建一个包装类,它的工作是在处理对象时删除文件,或者如果它不能在处理时删除文件,因为文件仍然被锁定,那么它会在垃圾收集器调用时被删除终结器。

另一种可能性是使用 FileOptions.DeleteOnClose - 您必须查看是否可以在您打开/创建的字体文件上使用 FontFamily,并且当前正在维护一个打开的文件句柄.

你说“ttf 文件驻留在一个临时位置,可以在以后的某个时间点删除。”...当你说在以后的某个时间点...我假设是在你退出程序/进程......或者不是这样?

或尝试 TempFileCollection:

关于c# - 如何处理 FormattedText/让 WPF 放弃 .TTF 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11084434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com