本記事の内容
ストアアプリのListView(以下本記事のListViewはストアアプリのものとする)にあるScrollViewを操作できるようになることが目的です。調べても思ったよりも記事が見つからなかったためここに残しておきます。
操作案
ListViewの操作方法としてぱっと思いつくものでは、
- ListViewをScrollViewで囲ってしまう
<ScrollView>
<ListView>
</ScrollView>
こんな感じです。
- ListViewの中のScrollViewをごにょごにょする
辺りが考えられますが、今回は下の「listViewの中のScrollViewをごにょごにょする」方を採用します。
理由としまして、囲ってしまうほうでは考え方が変わってしまう点と、ListViewが結果として伸びてしまう点があるためです。
実際に操作してみる
コードビハインドに以下のコードを追加します。
コード
/// <summary>
/// ここのメソッド名とかは何でもいいです。もちろんイベントでも可能。
/// </summary>
public void scrollOperation(){
var ScrollViewer = FindChild<ScrollViewer>(this.tableListView);
}
/// <summary>
/// 指定した型の最初に見つかったビジュアル要素を返す
/// </summary>
/// <typeparam name="T">型</typeparam>
/// <param name="root">探索対象のビジュアル要素</param>
/// <returns>見つかった場合はその要素</returns>
private static T FindChild<T>(DependencyObject root) where T : FrameworkElement
{
var childNumber = VisualTreeHelper.GetChildrenCount(root);
for (var i = 0; i < childNumber; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(root, i);
if (child != null && child is T)
{
return child as T;
}
else
{
return FindChild<T>(child);
}
}
return null;
}
解説
FindChildメソッドを利用して、その要素の指定した一番初めに見つかった型を取得してきています。今回は
FindChild<ScrollViewer>(ListViewの名前)
とし、ListViewの名前のScrollViewを取得してきています。
このコード自体は特に何もListViewに対して変更はかけていませんが、offsetプロパティを利用すればスクロール位置の記憶やChangeViewメソッドを利用すれば、変更も可能です。
ただし・・・
FindChildは一番初めから対象の型を探しに行くため、処理に時間がかかります。位置を記憶するような操作をするときは、なるべく処理する回数を減らすように心がけたほうが良いです。