【问题标题】:ComponentOne for WPF: Text seems to render in the incorrect position?WPF 的 ComponentOne:文本似乎呈现在不正确的位置?
【发布时间】:2012-12-28 01:06:07
【问题描述】:

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

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

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

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

谢谢!

-阿里

【问题讨论】:

    标签: wpf pdf pdf-generation componentone


    【解决方案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();}
        ...
    

    【讨论】:

    • 我很欣赏这些信息,但我实际上并没有在 WPF 中呈现。我正在使用 ComponentOne 库写入 PDF,尽管我在 WPF 应用程序中启动它。
    • @Ari 所以让我直截了当,1. 您使用WPF 作为初始文本。 2. 创建一个PDF 3. 使用CompoenetOne,然后当您将PDF 写回WPF 时,事情就真的搞砸了?请澄清这 3 个阶段中真正误入歧途的地方。
    • @Ari 通过阅读您给 Sorceri 的评论,我们为什么不将文本 font size 等同于 font height,这样行吗?
    • bonCodigo,从某种意义上说,由于 C1 组件的要求,我必须引用 PresentationCore 和 WindowsBase,这只是 WPF。除此之外,整个事情都在直接的 C# 中,没有任何实际的 WPF 控件。如果我不清楚这一点,我很抱歉。至于另一个问题,这似乎是问题所在——在 12 点字体上调用 C1 的 MeasureString() 会产生 9 的高度。我不确定这是 C1 的错误还是如果这是我遗漏的一些重要细节。
    • 你看到这个post on measuringText() vs gettextbounds了吗?我扫描了一下,看起来很有希望得到一个想法,但它是在 Android 平台上的。对于measuringString,你的Boxwidth 设置对了吗?
    【解决方案2】:

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

    还请务必检查该部分

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

    在下面的链接中

    Link to Method

    【讨论】:

    • 我对此进行了调查,实际上只是尝试过。它似乎没有帮助。我怀疑这实际上是 ComponentOne 的一个错误——它看起来(这是来自眼球)由于字体的实际高度(9)和字体大小(12)之间的差异,库渲染得太低,因为他们都在点上,我本来希望是相同的。
    【解决方案3】:

    好吧,经过进一步的研究和实验,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,只是因为我不知道字符串会变得多宽,所以我不想冒险获得多行高度。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多