2012-08-24 5 views
3

항목의 세로 ListView가있는보기가있는 WinRT/C#/XAML 앱이 있습니다. 항목의 양에 따라 ListView는 세로 스크롤 막대를 표시합니다. 다음은 XAML 정의입니다 :ListView를 선택된 항목으로 스크롤하십시오.

<UserControl.Resources> 
    <CollectionViewSource 
     x:Name="myViewSource" 
     Source="{Binding myViewModel.Items}" /> 
</UserControl.Resources> 
... 
<ListView 
    x:Name="myListView" 
    ItemsSource="{Binding Source={StaticResource myViewSource}}" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 
</ListView> 

지금 때마다 나는이보기로 이동, ListView에의 선택된 항목 뒤에 코드 (OnNavigatedTo)에서보기 모델의 데이터 바인딩의 selectedItem 속성을 설정하여 선택됩니다. 내 문제 : ListView이 선택한 항목을 자동으로 스크롤하지 않습니다. 스크롤 막대는 ListView의 맨 위에 있고 사용자는 선택한 항목을 보려면 수동으로 스크롤해야합니다.

코드 뒤에서 (OnNavigatedTo) SelectedItem을 설정 한 후에 myListView.ScrollIntoView(MyViewModel.SelectedItem);을 실행하려고했지만 작동하지 않습니다. 스크롤바는 맨 위에 남아 있습니다.

이 스레드는 SO : Scroll WinRT ListView to particular group에 대해 알고 있습니다. 이것은 비슷한 문제인 것 같습니다. 그러나 ListView의 시각적 트리를 수동으로 또는 WinRT XAML Toolkit으로 이동할 때 ScrollViewer를 찾지 못합니다 (대신 null이 반환됩니다).

+0

당신이 기다리고 있습니까? –

+0

OnNavigatedTo()에서 ScrollIntoView()를 호출하고 있습니다. 나는 이것이 올바른 장소라고 생각하고 ListView가로드되어 있어야합니다. 아니면 내가 틀릴 수도 있니? – Matthias

+3

컨트롤이로드되기 전에 OnNavigatedTo가 발생한다고 생각합니다. –

답변

14

필자는 ListView 컨트롤이 아직로드되지 않았기 때문에 ScrollIntoView()OnNavigatedTo()에 너무 일찍 나타났습니다. 모든 전에 현재의 ListView 항목 제의 부품의 선택된 항목과 중첩 심한 시각적 효과를 야기 불행히도

myListView.Loaded += (s, e) => 
    myListView.ScrollIntoView(MyViewModel.SelectedItem); 

:

제 용액 아이디어리스트 뷰의 Loaded 이벤트를 결합했다 잘 재정렬됩니다.

내가 찾은 마지막 해결책은보기의 Dispatcher를 통해 비동기 ScrollIntoView()를 호출하는 것입니다 다음하고 설계가 잘 작동이 솔루션을

myListView.Loaded += (s, e) => Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
    () => myListView.ScrollIntoView(MyViewModel.SelectedItem)); 

.

+0

솔루션에 작은 구문 오류가 있습니다.이 myListView.ScrollIntoView (MyViewModel.SelectedItem) 람다 식 본문 뒤에 세미콜론을 넣으십시오. – honzakuzel1989

+0

내 경우 myListView.UpdateLayout() myListView.ScrollIntoView() 전에도 도움이 – Borzh

1

나는 비슷한 필요성을 갖고 약간 다른 방식으로 해결했습니다. ListView에서 SelectionChangedEvent를 구독하고 핸들러 내에서 스크롤을 수행했습니다.

XAML :

<ListView x:Name="myListView" SelectionChanged="myListView_SelectionChanged" ...> 
</ListView> 

코드 : 스크롤을 시도하기 전에 ListView에가 (시각적 트리에 추가를)로드하는

private void myListView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    myListView.ScrollIntoView(myListView.SelectedItem); 
} 
관련 문제