2010-06-11 3 views
2

У меня есть TabControl с две вкладки, содержащих списки, которые всегда должны быть прокручивается на дно:WPF TabControl/ScrollIntoView Выпуск

<TabControl> 
     <TabItem Header="Tab1"> 
      <ScrollViewer VerticalScrollBarVisibility="Auto"> 
       <ListBox x:Name="List1"> 
        <ListBox.ItemTemplate> 
         <DataTemplate DataType="SampleClass"> 
          <TextBlock Text="{Binding SampleProperty}" /> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
      </ScrollViewer> 
     </TabItem> 
     <TabItem Header="Tab2"> 
      <ScrollViewer VerticalScrollBarVisibility="Auto"> 
       <ListBox x:Name="List2"> 
        <ListBox.ItemTemplate> 
         <DataTemplate DataType="OtherSampleClass"> 
          <TextBlock Text="{Binding SampleProperty}" /> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
      </ScrollViewer> 
     </TabItem> 
    </TabControl> 

Теперь у меня есть события, установленные таким образом, что, когда для изменения привязки, выполняется следующий код для прокрутки до нижней части списка (в зависимости от вкладки, это пример того, что происходит, когда элементы первого списка изменены):

ListBox1.ScrollIntoView(items.Last<SampleClass>()); 

Это прекрасно работает. Когда привязка изменяется, ListBox прокручивается вниз, как и ожидалось.

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

Я попытался подключиться к событию SelectionChanged элемента TabControl. Я предполагаю, что макет еще не отображается, когда это событие выполняется, поэтому вызов ScrollIntoView() ничего не делает.

Есть ли способ обойти это?

Спасибо.

ответ

3

Вы можете задержать свой ScrollIntoView вызова с использованием Dispatcher.BeginInvoke с низким приоритетом:

Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() => 
{ 
    ListBox1.ScrollIntoView(items.Last()); 
})); 

Теперь ScrollIntoView не будет вызван, пока вся обработка выше входного приоритета не завершена.

+0

Работает как очарование! Благодаря! – thebfactor

+0

Вы серьезно? –

Смежные вопросы