我在文档上渲染文本时遇到了问题。具体来说,文本呈现得太低。我尝试在文本后面填充一个矩形以查看发生了什么,并且我发现它们似乎呈现略微偏移:
这是我用来渲染框和文本的代码:
_doc.FillRectangle(Colors.LightGray, 36, 72, 37.344, 9);
_doc.DrawString("Lorem", new Font("Arial", 12), Colors.Black,
new Rect(36, 72, 37.344, 9));
我知道矩形(9)的高度似乎与字体(12)的高度不匹配,我认为这可能是最初的问题。然而,我在字体本身上做了一个MeasureString并发现它的高度实际上是9而不是12(我使用了直接窗口,这就是为什么它是pic而不是文本块):
关于什么可能导致它以及如何避免它的任何想法?
谢谢!
-Ari
答案 0 :(得分:1)
其他帖子之一:WPF Text rendering problem,声明 SnapToDevicePixels
可能会破坏文字呈现,如果文字已调整为跨像素显示。建议的答案是保持,
SnapToDevicePixels = True on borders/backgrounds
但请关闭text elements
。
至于您正在使用的当前方法。请查看我的一些帖子:Increase bar chart values with button clicks:我使用DrawString()
在rectangle
内添加了一封信。所有绘图均以 Panel
。
代码: ...
panel1.Paint += new PaintEventHandler(panel1_Paint);
using (Graphics g = this.panel1.CreateGraphics())
{
Brush brush = new SolidBrush(Color.Green);
g.FillRectangle(brush, px, py, 20, 20);
Pen pen = new Pen(new SolidBrush(Color.White));
g.DrawRectangle(pen, px, py, 20, 20);
//add each total5Click into chart block
g.DrawString((total5Times).ToString(), new Font("Arial", 7),
new SolidBrush(Color.AntiqueWhite),
px + 1, py+8, StringFormat.GenericDefault);
pen.Dispose();}
...
答案 1 :(得分:0)
我建议使用方法DrawString Method (String, Font, Brush, RectangleF, StringFormat)
并提供字符串格式。在查看ComponentOne之后,看起来它们正在组合几个方法,因此我可能会遇到该方法的StringFormat默认设置问题。我假设他们正在调用主DrawString方法并传入默认参数(如果没有提供)。
另请务必查看
部分使用LineAlignment指定字符串的垂直对齐方式。
在下面的链接中
答案 2 :(得分:0)
嗯,经过进一步的研究和实验,ComponentOne库肯定存在一个错误。具体来说,我碰巧在这里使用的重载返回了错误的高度。如果明确指定可用宽度,则会获得正确的高度。具体来说,此代码生成正确的数据:
var resultHeight = _doc.MeasureString(text, pdfFont, double.MaxValue).Height;
var resultWidth = _doc.MeasureString(text, pdfFont).Width;
return new Tuple<double,double>(resultHeight, resultWidth);
请注意仅为高度添加第三个参数 - double.MaxValue
。在两种情况下都可以正确计算宽度,但只有在提供double
参数时才能正确计算高度。在这种情况下我选择double.MaxValue
只是因为我不知道字符串的宽度是多少所以我不想冒险被赋予多行高度。