3

在我的文档上呈现文本时遇到问题。具体来说,文本呈现得太低。我尝试在文本后面填充一个矩形以查看会发生什么,我发现它们似乎呈现略微偏移:

使用相同的矩形从背景偏移文本。

这是我用来呈现框和文本的代码:

_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(我为此使用了即时窗口,这就是为什么它是图片而不是文本块的原因):

立即窗口调用 MeasureString 的结果。

关于什么可能导致它以及如何避免它的任何想法?

谢谢!

-阿里

4

3 回答 3

1
  • 有几篇文章讨论了WPF 文本呈现不一致问题。

  • 其他帖子之一:WPF 文本渲染问题,指出SnapToDevicePixels如果文本已调整大小以跨像素显示,则可能会破坏文本渲染。建议的答案是保留,

    SnapToDevicePixels = True on borders/backgrounds但将其关闭text elements

  • 至于您正在使用的当前方法。请查看我之前的一篇文章:通过单击按钮增加条形图值:我曾经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();}
    ...
于 2012-12-31T20:46:42.527 回答
0

我建议使用该方法DrawString Method (String, Font, Brush, RectangleF, StringFormat)并提供字符串格式。在查看了 ComponentOne 之后,他们似乎将几种方法放在一起,所以我可能对该方法的 StringFormat 默认设置存在问题。我有点假设他们正在调用主要的 DrawString 方法并在未提供默认参数时传入默认参数。

还请务必检查该部分

使用 LineAlignment 指定字符串的垂直对齐方式。

在下面的链接中

链接到方法

于 2012-12-31T20:40:31.460 回答
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在这种情况下选择只是因为我不知道字符串会变得多宽,所以我不想冒险被赋予多行高度。

于 2013-01-10T01:05:19.007 回答