Scrollviewer.ComputedVerticalScrollBarVisibility не изменяется в цикле [закрыто]C#

Место общения программистов C#
Anonymous
Scrollviewer.ComputedVerticalScrollBarVisibility не изменяется в цикле [закрыто]

Сообщение Anonymous »

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








Теперь я хочу, чтобы RichTextBox имел размер текста сноски, не слишком большой и не слишком маленький. Поэтому я создаю элемент управления небольшим, а в цикле while увеличиваю его и проверяю, установлено ли значение ComputedVerticalScrollBarVisibility элемента управления ScrollViewer Visibility на другое значение, кроме Visible. В Winforms это работало, но здесь, в WPF, этого никогда не происходит.
while (scrol.ComputedVerticalScrollBarVisibility == Visibility.Visible)
{
this.Width = this.Width + 20;
currentTop -= 10;
Canvas.SetTop(this, currentTop);
this.Height = this.Height + 10;
}

Я проверил RTB, и он растет вместе с UserControl.
Скажем, если я пишу
while (scrol.ComputedVerticalScrollBarVisibility == Visibility.Visible && Width < 500)

Наконец, он показывает весь текст с ненужным пространством.
Может кто-нибудь мне помочь?
РЕДАКТИРОВАНИЕ: проблема решена
Благодаря @EldHasp я нашел способ контролировать влияние пользовательского интерфейса из-за работающего кода:

В WPF рендеринг и макет пользовательского интерфейса — это отдельные операции. Поскольку ваш цикл выполняется в потоке пользовательского интерфейса, он блокирует обработку диспетчером следующего прохода макета. Таким образом, ComputedVerticalScrollBarVisibility не будет обновляться, пока ваш код не завершится. Вы можете исправить это, используя async и ожидая Dispatcher.Yield(DispatcherPriority.ContextIdle); внутри цикла, чтобы обновить пользовательский интерфейс, но это значительно замедлит работу интерфейса. Лучшим способом является использование SizeToContent или измерение размера контента.

Поэтому я написал код таким образом, чтобы увеличить размер элемента управления с помощью команды Measure и сохранить правильное соотношение между высотой и шириной:
Measure(rtfFootnote.DesiredSize);
while (rtfFootnote.DesiredSize.Height * 2 > rtfFootnote.DesiredSize.Width)
{
this.Width += 40;
this.Height += 20;
Measure(rtfFootnote.DesiredSize);
}

Вернуться в «C#»