2010-06-11 92 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滾動到底部。但是,當我設置相同的代碼以執行選項卡更改時(在選項卡更改時滾動到列表底部)時,列表不會按預期滾動到底部(並顯示滾動到最佳)。

我嘗試掛鉤TabControl的SelectionChanged事件。我的猜測是當這個事件被執行時佈局還沒有渲染,所以調用ScrollIntoView()什麼都不做。

有沒有辦法解決這個問題?

謝謝。

回答

3

您可以使用Dispatcher.BeginInvoke具有低優先級耽誤您的通話ScrollIntoView:

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

現在ScrollIntoView實際上不會被調用,直到輸入以上所有優先級的處理已完成。

+0

工程就像一個魅力!謝謝! – thebfactor 2010-06-14 13:18:54

+0

你是認真的嗎? – 2015-09-08 14:39:40