ComponentOne для WPF: кажется, текст отображается в неправильном положении?

У меня возникают проблемы при отображении текста в моем документе. В частности, текст отображается слишком низко. Я попытался заполнить прямоугольник позади текста, чтобы посмотреть, что происходит, и обнаружил, что они, похоже, слегка смещены:

Смещение текста от фона с использованием того же прямоугольника.

Вот код, который я использовал для визуализации поля и текста:

_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.

Есть идеи относительно того, что может быть причиной этого и как этого избежать?

Спасибо!

-Ари


person Ari Roth    schedule 28.12.2012    source источник


Ответы (3)


  • Есть несколько сообщений, в которых обсуждаются несоответствия отрисовки текста 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();}
    ...
person bonCodigo    schedule 31.12.2012
comment
Я ценю информацию, но на самом деле я не выполняю рендеринг в WPF. Я использую библиотеку ComponentOne для записи в PDF, хотя запускаю ее в приложении WPF. - person Ari Roth; 03.01.2013
comment
@Ari, позвольте мне уточнить: 1. вы используете WPF в качестве исходного текста. 2. Сделайте PDF 3. Используйте CompoenetOne, тогда все буквально испортится, когда вы напишете PDF обратно в WPF? поясните, пожалуйста, из этих трех этапов, на которых что-то действительно сбивается. - person bonCodigo; 03.01.2013
comment
@Ari, прочитав комментарий, который вы дали Sorceri, почему бы нам не сделать текст font size эквивалентом font height, это сработает? - person bonCodigo; 03.01.2013
comment
bonCodigo, это только WPF в том смысле, что у меня должны быть ссылки на PresentationCore и WindowsBase из-за требований со стороны компонента C1. В остальном все это на чистом C # без каких-либо реальных элементов управления WPF. Прошу прощения, если я не понял этого. Что касается другого вопроса, то, похоже, это проблема - вызов метода C1 MeasureString () для шрифта из 12 пунктов дает высоту 9. Я не уверен в том, является ли это ошибкой со стороны C1 или если это какая-то важная деталь, которую мне не хватает. - person Ari Roth; 03.01.2013
comment
Вы видели эту публикацию об измеренииText () vs gettextbounds? Я немного отсканировал и выглядит очень многообещающим, чтобы получить представление, но это на платформах Android. Для measuringString правильно ли вы установили Boxwidth? - person bonCodigo; 03.01.2013

Я бы предложил использовать метод DrawString Method (String, Font, Brush, RectangleF, StringFormat) и предоставить строковый формат. После просмотра ComponentOne выяснилось, что они объединяют несколько методов, поэтому у меня может возникнуть проблема с набором StringFormat по умолчанию для метода. Я предполагаю, что они вызывают основной метод DrawString и передают параметры по умолчанию, если они не были предоставлены.

Также не забудьте проверить раздел для

Используйте LineAlignment, чтобы указать вертикальное выравнивание строки.

по ссылке ниже

"nofollow

person Sorceri    schedule 31.12.2012
comment
Я изучил это, и на самом деле просто попробовал. Кажется, это не помогает. Я подозреваю, что на самом деле это ошибка со стороны ComponentOne - похоже (и это на глаз) библиотека отображает слишком низко из-за разницы между фактической высотой шрифта (9) и размером шрифта (12), который, так как они оба в очках, я ожидал, что они будут идентичными. - person Ari Roth; 03.01.2013

Что ж, после дальнейших исследований и экспериментов в библиотеке 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 в этом случае просто потому, что не знаю, какой шириной будет строка, поэтому я не хочу рисковать, если мне зададут многострочную высоту.

person Ari Roth    schedule 10.01.2013