Отступы в WPF TextFormatter - PullRequest
       33

Отступы в WPF TextFormatter

1 голос
/ 02 сентября 2010

Я делаю текстовый редактор WPF, используя TextFormatter.Мне нужно сделать отступ для некоторых абзацев, поэтому я использую свойство Indent из класса TextParagraphProperties.

Это прекрасно работает в этом сценарии:

Обычный текст без отступа
.
Этот абзац имеет одинаковый отступ
, поэтому все равно
ок.

Но мне также нужно следующее:
Джон: Этот абзац имеет отступ
, отличающийся
в первой строке.
Джо. Так что я не знаю, как
сделать это.

Я нашел свойства ParagraphIndent и FirstLineInParagraph, но не знаю, как они работают, илиесли тогда будет полезно.

Спасибо заранее !!Хосе

1 Ответ

1 голос
/ 14 октября 2010

Хосе -

Надеюсь, этот скелет кода поможет ... Я предполагаю, что вы начали с проекта расширенного форматирования текста на MSDN, который, к сожалению, не очень продвинут.Вот фрагмент кода, который вы можете представить в MainWindow.Xaml.cs:

        TextParagraphProperties textParagraphProperties = new GenericTextParagraphProperties(TextAlignment.Left,
                                                                                             false);
        TextRunCache textRunCache = new TextRunCache();

        // By default, this is the first line of a paragrph
        bool firstLine = true;
        while (textStorePosition < _textStore.Length)
        {
            // Create a textline from the text store using the TextFormatter object.
            TextLine myTextLine = formatter.FormatLine(
                _textStore,
                textStorePosition,
                96 * 6,

                // ProxyTextParagraphProperties will return a different value for the Indent property,
                // depending on whether firstLine is true or not.
                new ProxyTextParagraphProperties(textParagraphProperties, firstLine),
                lastLineBreak,
                textRunCache);

            // Draw the formatted text into the drawing context.
            Debug.WriteLine("linePosition:" + linePosition);
            myTextLine.Draw(dc, linePosition, InvertAxes.None);

            // Update the index position in the text store.
            textStorePosition += myTextLine.Length;

            // Update the line position coordinate for the displayed line.
            linePosition.Y += myTextLine.Height;

            // Figure out if the next line is the first line of a paragraph
            var textRunSpans = myTextLine.GetTextRunSpans();
            firstLine = (textRunSpans.Count > 0) && (textRunSpans[textRunSpans.Count - 1].Value is TextEndOfParagraph);

            lastLineBreak = myTextLine.GetTextLineBreak();
        }

Вам необходимо создать класс ProxyTextParagraphProperties, который происходит от TextParagraphProperties.Вот фрагмент того, что я сделал, чтобы проверить это:

class ProxyTextParagraphProperties : TextParagraphProperties
{
    private readonly TextParagraphProperties _paragraphProperties;
    private readonly bool _firstLineInParagraph;

    public ProxyTextParagraphProperties(TextParagraphProperties textParagraphProperties, bool firstLineInParagraph)
    {
        _paragraphProperties = textParagraphProperties;
        _firstLineInParagraph = firstLineInParagraph;
    }

    public override FlowDirection FlowDirection
    {
        get { return _paragraphProperties.FlowDirection; }
    }

    // implement the same as above for all the other properties...

    // But we need to handle this one specially...
    public override double Indent
    {
        get
        {
            return _firstLineInParagraph ? _paragraphProperties.Indent : 0;
        }
    }
}
...