0

作为序言,我需要使用: * ClickOnce 部署 * 条形码字体 * 使用“FontName”但无法访问 Font 对象的 DevExpress 控件,阻止我使用 PrivateFontCollection。* 字体必须静默安装并在安装后立即运行。

DevExpress 中阻止我使用 PFC 的部分是 RichEditControl 中的 CharacterProperties 对象。他们的支持网站已经有一张以“抱歉,我们无法使其与 PrivateFontCollection 一起使用”结尾的票证。

我从许多来源阅读并不断发现 ClickOnce 在安装时无法立即使用字体。我正在使用 P/Invoke 安装字体,因为我无法使用 PFC。我创建了一个完全独立的控制台应用程序来安装这个字体,并且字体显示在 Word 中,但它没有显示在我的 ClickOnce 应用程序中,即使我在 Word 之后打开它。我可以通过正常的 Windows 单击方法手动安装字体,它会同时显示在 Word 和 ClickOnce 中。

我用 System.Drawing.Font 验证了它对整个应用程序不可用,而不仅仅是一个挑剔的供应商控制:

Font fontTester = new Font(fontName, 12, FontStyle.Regular, GraphicsUnit.Pixel);
if (fontTester.Name == fontName)

“名称”值更改为“Microsoft Sans-Serif”,就好像字体不可用一样。

如何在不重新启动/注销的情况下让字体显示在 ClickOnce 中?

4

2 回答 2

0

我不确定您是否可以通过将字体放入 Windows 目录以传统方式安装字体 - ClickOnce 沙箱会阻止您执行此类操作。

但是您可以使用代码动态添加字体,但仅限于当前用户。

这篇MSDN 文章显示了 System.Drawing.Text 命名空间上的 AddFontFile 方法,这里有关于这个问题的进一步讨论忽略错误地说不可能的人)

编辑:看起来它可能是你的命名空间。请参阅C# - 阅读和预览字体

我会尝试以某种方式从您的应用程序中列出字体,看看它们是否可以被阅读。

于 2012-09-14T12:19:33.683 回答
0

控制台应用程序中的 P/Invoke 方法不起作用,我没有时间弄清楚原因,但是使用带有 Shell.Application 的 VBScript 可以。

Const FONTS = &H14&

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(FONTS)
objFolder.CopyHere "\\server\Fonts\barcodefont.ttf"

我实际上是从这个开始的,但无论出于何种原因它都不起作用,所以我转向了其他方法,包括控制台应用程序。

于 2012-09-14T21:17:22.457 回答