Как получить следующую строку с помощью TextPointer.GetLineStartPosition () в RichTextBox - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь получить строки из RichTextBox.

Здесь показано, как это сделать:
Использование GetLineStartPosition, чтобы получить конец строки в WPF RichTextBox

Но по какой-то причине я всегда получаю null в качестве возврата GetLineStartPosition(1).

XAML

    <Grid>
        <StackPanel>
            <Button Height="40" Click="Button_Click"></Button>

            <RichTextBox x:Name="rtbEditor">
                <FlowDocument>
                    <Paragraph>Hello, world!
                        a
                        <LineBreak/>
                        b
                        <LineBreak/>
                        c
                        <LineBreak/>
                        d
                    </Paragraph>
                </FlowDocument>
            </RichTextBox>
        </StackPanel>
    </Grid>

Код

        public MainWindow()
        {
            InitializeComponent();

            rtbEditor.AppendText("testtext" + "\r");
            rtbEditor.AppendText("testtext" + "\r");
            rtbEditor.AppendText("testtext" + "\r");
            rtbEditor.AppendText("testtext" + "\r\n");
            rtbEditor.AppendText("testtext" + "\r\n");
            rtbEditor.AppendText("testtext" + "\r\n");
            rtbEditor.AppendText("testtext" + "\n");
            rtbEditor.AppendText("testtext" + "\n");
            rtbEditor.AppendText("testtext" + "\n");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            TextPointer contentStart = rtbEditor.Document.ContentStart;
            var nextStart = contentStart.GetLineStartPosition(1);
        }

nextStart равно null. Что я здесь делаю не так?

1 Ответ

1 голос
/ 29 мая 2020

Это потребовало небольшого исследования того, как работали FlowDocument s и TextPointer s. Я предлагаю прочитать раздел TextPointer Remarks , потому что он действительно помог мне понять это.

Моя теория состоит в том, что метод GetLineStartPosition не будет работать, если текущий TextPointer не работает. t иметь Paragraph для ссылки. Document.ContentStart дает вам TextPointer, который находится непосредственно перед первым Paragraph в FlowDocument. Вы можете вызвать GetNextInsertionPosition(LogicalDirection.Forward), чтобы вернуть TextPointer к следующей допустимой точке вставки - в данном случае первой действительной точке вставки - в документе. Оттуда вы попадаете внутрь первого Paragraph и GetLineStartPosition начинает работать.

TextPointer contentStart = rtbEditor.Document.ContentStart.GetNextInsertionPosition(LogicalDirection.Forward);
var nextStart = contentStart.GetLineStartPosition(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...