Остановка автоматической прокрутки до нижней части списка

#silverlight #telerik

#silverlight #telerik

Вопрос:

Я использую RadGridView Telerik в UserControl для отображения списка сообщений, полученных с XMPP-сервера. Я смог настроить его так, чтобы при получении сообщения я мог прокручивать до конца списка примерно так:

 private GridViewScrollViewer scrollViewer;

void controller_OnMessageReceived(object sender, EventArgs e)
{
    scrollViewer = receivedMessageList.ChildrenOfType<GridViewScrollViewer>().FirstOrDefault();
    scrollViewer.ScrollToBottom();
}
  

Однако я хочу иметь возможность отключить автоматическую прокрутку, когда пользователь использует полосу прокрутки, а затем снова включить ее, когда он прокручивается до конца списка. Я думал, что смогу подключиться к ScrollChanged событию, но, похоже, в нем недостаточно информации для использования.

В качестве небольшого дополнения к этому в Loaded случае элемента управления и RadGridView вызов ScrollViewer, который я привел выше, имеет значение null. Я думал, что после загрузки элемента управления все элементы пользовательского интерфейса готовы?

Ответ №1:

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

 ScrollViewer.HorizontalScrollBarVisibility="Visible"
ScrollViewer.VerticalScrollBarVisibility="Visible"
  

В вашем XAML

Теперь о реальной проблеме:
вы можете отслеживать HorizontalOffset и VerticalOffset из scrollviewer:

Создайте два Double поля в своем классе, чтобы сохранить их, а затем, перед вызовом ScrollToBottom() , сравните текущие значения с сохраненными.
Если пользователь вручную переместил полосы прокрутки, значения будут другими, и вы не будете прокручивать, иначе вы ScrollToBottom() .

Комментарии:

1. Изменение режима просмотра прокрутки на видимый не помогает. Я уверен, что в том, как был создан элемент управления, есть что-то, что вызывает это. Я подозреваю, что в конечном итоге это отследит. Мониторинг смещения звучит так, как будто это вполне может быть способом сделать это, однако, когда изменяется размер окна или списка, также изменяется смещение, поэтому я предполагаю, что это может включать мониторинг в разных местах. Но я думаю, это место для начала 🙂