Обнаружьте изменение FlowDocument и прокрутку

Различием между 12,345 на французском и английском языке является фактор 1 000. Если Вы предоставляете ожидаемый диапазон где макс. < 1000*min, можно легко предположить.

Берут, например, высоту человека (включая младенцев и детей) в мм.

При помощи диапазона 200-3000, вход 1 800 или 1,800 может однозначно быть интерпретирован как 1 метр и 80 сантиметров, тогда как вход 912 300 или 912,300 может однозначно быть интерпретирован как 91 сантиметр и 2,3 миллиметра.

5
задан Dave Clemmer 25 August 2011 в 06:10
поделиться

2 ответа

Вы можете обнаружить изменения в FlowDocument , создав текстовый диапазон и отслеживая его на предмет изменений. Прокрутка вниз труднее, потому что вам нужно найти ScrollViewer . Также для повышения производительности вам не нужно повторять все вычисления прокрутки при каждом изменении, поэтому вам следует использовать DispatcherOperations .

Собирая все вместе, следующий код должен помочь:

var range = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
object operation = null;

range.Changed += (obj, e) =>
{
  if(operation==null)
    operation = Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
    {
      operation = null;

      var scrollViewer = FindFirstVisualDescendantOfType<ScrollViewer>(flowDocument);
      scrollViewer.ScrollToBottom();
    });
};

где FindFirstVisualDescendantOfType - это простой поиск по префиксу в глубину визуального дерева с использованием VisualTreeHelper.GetChildrenCount () и VisualTreeHelper.GetChild () , найденного и возвращающего первый найденный VisualTree type.

Обратите внимание, что для большей общности я не выполняю предварительное вычисление scrollViewer в верхней части кода, потому что шаблон FlowDocumentScrollViewer может изменяться. Если этого не произойдет, этот код можно ускорить, позвонив по номеру .

8
ответ дан 13 December 2019 в 05:37
поделиться

Используете ли вы RichTextBox для редактирования? В таком случае вы должны просто перехватить событие TextChanged , а затем вызвать метод ScrollToVerticalOffset со значением из ViewportHeight , свойство .

2
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: