Различием между 12,345 на французском и английском языке является фактор 1 000. Если Вы предоставляете ожидаемый диапазон где макс. < 1000*min, можно легко предположить.
Берут, например, высоту человека (включая младенцев и детей) в мм.
При помощи диапазона 200-3000, вход 1 800 или 1,800 может однозначно быть интерпретирован как 1 метр и 80 сантиметров, тогда как вход 912 300 или 912,300 может однозначно быть интерпретирован как 91 сантиметр и 2,3 миллиметра.
Вы можете обнаружить изменения в 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
может изменяться. Если этого не произойдет, этот код можно ускорить, позвонив по номеру .
Используете ли вы RichTextBox для редактирования? В таком случае вы должны просто перехватить событие TextChanged
, а затем вызвать метод ScrollToVerticalOffset
со значением из ViewportHeight
, свойство .