2010-06-11 1 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> 

을 때 바인딩 변경에 따라 다음 코드가 실행되어 목록 맨 아래로 스크롤됩니다 (탭에 따라 다르지만 첫 번째 목록 항목이 변경 될 때 발생하는 예입니다)

잘 작동합니다. 바인딩이 변경되면 ListBox가 예상대로 맨 아래로 스크롤됩니다.

그러나 탭을 변경할 때 목록을 아래로 스크롤 할 때 동일한 코드를 설정하면 목록이 예상대로 아래로 스크롤되지 않습니다. 상단).

TabControl의 SelectionChanged 이벤트에 후킹을 시도했습니다. 내 생각 엔이 이벤트가 실행될 때 레이아웃이 렌더링되지 않으므로 ScrollIntoView()를 호출해도 아무 일도 일어나지 않습니다.

이 문제가 발생합니까?

감사합니다.

답변

3

당신은 낮은 우선 순위를 가진 Dispatcher.BeginInvoke를 사용하여 ScrollIntoView 호출을 지연시킬 수 있습니다 : 입력 우선 위의 모든 처리가 완료 될 때까지

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

이제 ScrollIntoView 실제로 호출되지 않습니다.

+0

매력처럼 작동합니다! 감사! – thebfactor

+0

진심이야? –