用于WPF的ComponentOne:文本似乎呈现在错误的位置?

时间:2012-12-28 01:06:07

标签: wpf pdf pdf-generation componentone

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

Offset text from background using the same rectangle.

这是我用来渲染框和文本的代码:

_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而不是文本块):

Results of the Immediate Window calling MeasureString.

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

谢谢!

-Ari

3 个答案:

答案 0 :(得分:1)

  • 有几篇帖子讨论WPF text rendering inconsistencies

  • 其他帖子之一: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指定字符串的垂直对齐方式。

在下面的链接中

Link to Method

答案 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只是因为我不知道字符串的宽度是多少所以我不想冒险被赋予多行高度。