我正在开发一个标签设计程序,遇到了一个非常奇怪的问题,我在互联网上的任何地方都找不到答案.

基本解释是,当DrawString()layoutRectangle属性设置为略高于文本长度大小的任何值时,字距调整似乎就会关闭.字符"TE"的组合最明显.

Correct Kerning with 'layoutRectangle' just enough to fit the text:
1

Wrong kerning with 'layoutRectangle' larger than required to fit the text:
2

您可能可以发现第二张图像中的"e"比第一张图像中的"e"画得更远.我在一个新项目中try 过,也发生了同样的事情.即使根本没有指定layoutRectangle,您也可以观察到相同的行为.

以下是绘制字符串的代码行:

canvasGraphics.Graphics.DrawString(
    _displayText.FormattedTextValue,
    new Font(FontName, (float)((drawFontSizeToUse / 72d) * Canvas.RenderDPI), fontStyle, GraphicsUnit.Pixel),
    Brushes.Black,
    (Rectangle)new RectangleD(ScreenBounds.X, ScreenBounds.Y, ScreenBounds.Width, ScreenBounds.Height),
    stringFormat
);

stringFormat只是根据设置更改对齐方式.

有人知道如何解决这个问题吗?谢谢!

我try 过操纵不同的StringFormatTextRenderingHint和任何Font选项等(尽管可能有一些我不知道的.)

我无法使用"TextRenderer",因为它无法用于打印.

推荐答案

我只是想确保这个问题已经完成,并且会帮助某人.

我要感谢@Ian Boyd和@Dr. num的答案,他们对future 确实很有帮助.我建议任何面临文本绘制问题的人查看他们的答案并try 调整他们的答案.

出于我的目的,由于我真的不想改变现在运行的方式,并且我需要打印功能,所以我找到了一个非常简单的解决方案来解决这个问题,那就是:

Add "\n" to the end of the string parameter passed onto the Graphics.DrawString. It's a ridiculous and an easy fix, but it works!

Csharp相关问答推荐

在包含空项的列表上使用具有断言T的摘要表

需要深入了解NpgSQL DateTimeOffset处理

哪个nuget包含SecurityStampValidatorOptions

使用特定格式的JsonConvert序列化对象

什么是通过反射创建类的泛型接口方法的正确方法?

数组被内部函数租用时,如何将数组返回给ArrayPool?

如何分配对象后的class的属性?

将现有字段映射到EFCore中的复杂类型

在命名管道上使用GRPC ASP.NET核心时如何配置命名管道权限

使用两个不同的枚举作为Switch语句中的CASE生成唯一值

获取具有AutoFaces的所有IOptions对象的集合

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

该函数不能检测两条曲线的交点

如何将FindAll()与Nuget包Interop.UIAutomationClient一起使用

如何防止Visual Studio断点以红色突出显示到整行?

RCL在毛伊岛应用程序和Blazor服务器应用程序.Net 8.0中使用页面

在C#和HttpClient中使用REST API

如何在C#中反序列化Java持续时间?

Windows 10上埃及标准时间的时区偏移不正确

为什么我不能在固定语句中使用外部函数?