8

アイテムの垂直ListViewを持つビューを持つWinRT/C#/XAMLアプリがあります。アイテムの量に応じて、ListViewは垂直スクロールバーを表示します。XAMLの定義は次のとおりです。

<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>

これで、このビューに移動するたびに、コードビハインド()からビューモデルのデータバインドされたSelectedItemプロパティを設定することにより、ListViewの選択されたアイテムが選択されますOnNavigatedTo。私の問題:ListViewはこの選択されたアイテムに自動的にスクロールしません。スクロールバーはListViewの上部に残り、ユーザーは選択したアイテムを表示するために手動でスクロールする必要があります。

myListView.ScrollIntoView(MyViewModel.SelectedItem);コードビハインド(in)でSelectedItemを設定して実行しようとしましOnNavigatedToたが、動作しません。スクロールバーは上部に残ります。

SOでこのスレッドを認識しています:WinRTListViewを特定のグループにスクロールします。これも同様の問題のようです。しかし、ListViewのビジュアルツリーを手動で、またはWinRT XAML Toolkitを使用してウォークすると、ScrollViewerが見つかりません(代わりにnullを返します)。

4

2 に答える 2

18

フィリップのおかげで、コントロールがまだこの場所にロードされていないため、呼び出しが早すぎることに気づきScrollIntoView()ました。OnNavigatedTo()ListView

Loaded最初の解決策のアイデアは、ListViewのイベントをバインドすることでした。

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

残念ながら、これは厄介な視覚効果を引き起こします。現在のListViewアイテムは、すべてが適切に再配置される前に、選択されたアイテムと1秒間オーバーラップします。

私が見つけた最後の解決策は、ビューScrollIntoView()を介して非同期的に呼び出すことです。Dispatcher

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

このソリューションでは、レイアウトは正常に機能します。

于 2012-08-27T07:18:38.117 に答える
4

私も同様のニーズがあり、少し異なる方法で解決しました。ListViewからSelectionChangedEventをサブスクライブし、ハンドラー内でスクロールを実行しました。

XAML:

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

コード:

private void myListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    myListView.ScrollIntoView(myListView.SelectedItem);
}
于 2016-10-10T15:02:05.107 に答える