4

У меня есть WPF RichTextBox в моем приложении, которое находится в Grid. Он обновляется каждый второй или второй, поскольку он отображает журналы (хотя иногда нет журналов в течение минуты в зависимости от нагрузки).RichTextBox прокрутка до конца не работает, когда не отображается

Сетка не всегда видна, так как она находится на собственной вкладке. Если пользователь находится на другой вкладке, журнал не отображается.

Моя проблема в том, что я хочу, чтобы RichTextBox прокручивался до конца каждый раз при добавлении нового абзаца. Это казалось простым, поскольку в элементе управления RichTextBox есть метод ScrollToEnd, и поэтому я вызываю этот метод каждый раз, когда текст добавляется в элемент управления.

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

Есть ли способ вокруг этой досадной «функции» управления? Я хотел бы ВСЕГДА иметь RichTextBox в нижней части, если пользователь не будет вручную управлять полосой прокрутки.

Спасибо!

ответ

3

По умолчанию TabControl фактически не изменяет видимость содержимого, он полностью удаляет их из представления при изменении вкладок и затем «повторно прикрепляет» их при переходе на предыдущую вкладку.

Вот почему изменение видимости не срабатывает. Вместо этого вы должны обработать событие Loaded, которое должно быть запущено прямо перед просмотром представления.

+0

Это прекрасно исправило мою проблему, теперь, когда я подключился к загруженному событию, все идеально! Я не могу поверить, что я никогда не думал об этом, я предполагал, что он меняет видимость, а не удаляется и снова добавляется. Награда за награду. –

+0

Это довольно противоречиво и не очень хорошо документировано: P Мы также обнаружили сложный путь, после многих проб и ошибок и, наконец, прибег к Snoop, чтобы проверить визуальное дерево. Выяснили, что каждый раз визуализируется только содержимое одного TabItem! (спасибо за щедрость :) – almulo

1

Есть ли причина, по которой вы не можете просто вызвать ScrollToEnd в ответ на текстовое поле, которое становится видимым? Это похоже на самый простой подход. Вы попробовали это и столкнулись с проблемой?

Редактировать: Если вы используете TabControl, у каждого TabItem есть свойство IsSelected, с которым вы можете связаться с ItemContainerStyle. Вероятно, вы можете прокрутить свое текстовое поле в ответ на выбранную вкладку.


В качестве отдельного примечания: если вы планируете создать специальный контроль для этого, вот некоторые вещи, которые следует учитывать.

Я написал автопрокрутку версию FlowDocumentScrollViewer. (Мне никогда не нужен был RichTextBox, но они отображают аналогичный контент.) Я могу сказать вам, что есть много вещей, которые нужно учитывать, например, знать, когда и когда не выполнять автоматическую прокрутку, в зависимости от того, что делает пользователь в данный момент.

Например:

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

Кроме того, определение того, что пользователь делает для начала, иногда может быть сложным процессом самостоятельно.

+0

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

+0

Если вы используете 'TabControl', каждый' TabItem' имеет свойство [IsSelected] (https://msdn.microsoft.com/en-us/library/system.windows.controls.tabem.isselected.aspx), то вы может связываться с «ItemContainerStyle». Вероятно, вы можете прокрутить свое текстовое поле в ответ на выбранную вкладку. – Xavier

+0

Мы используем нечто похожее, а не обычный TabItem/TabControl, но достаточно близко. Это дает мне хорошую идею, хотя для чего-то попробовать, что я никогда не думал об этом никогда. Если это сработает, я приму свой ответ. Ответ сам, даже если это не мое точное решение, я думаю, это хороший ответ, который другие люди могли бы использовать/видеть в будущем. –