2011-06-14

ScrollViewer の最終行で処理をする

以前のエントリでも書いていたののですが、Wakamurasaki のスレッド一覧で最終行にきたときに続きを読む方法を探していました。




スレッド一覧は ScrollViewer + StackPanel で作っているのですが、ScrollViewer にはスクロールが終わったことを教えてくれるようなイベントはありません。
仕方なく GestureListener で DragStarted イベントを拾ったりしていたんですが、いまひとつでした。

何か他にないものかと探していたところ、Prism の中に DependencyPropertyListener というステキなクラスがある事を発見しました。
これを使って ScrollViewer のプロパティを監視すればいいじゃないですか。

var scrollViewerListener = new DependencyPropertyListener();
scrollViewerListener.Changed += (s, e) =>
{
    if (this.ThreadScrollView.ScrollableHeight == this.ThreadScrollView.VerticalOffset)
    {
        System.Diagnostics.Debug.WriteLine("最終行ですよ");
    }
};
Binding binding = new Binding("VerticalOffset") { Source = this.ThreadScrollView };
this._scrollViewerListener.Attach(this.ThreadScrollView, binding);



こんな感じでほぼイメージ通りの動作をするようになりました。

ただ、WPDT 7.1 のエミュレータだと それなりに動くのですが、 WPDT 7 のエミュレータや 実機だとスレッドを追加するときに画面が止まってしまって かなりストレスがたまります。
Mango へのアップデートが待ち遠しいですね。

2 件のコメント:

青柳 臣一 さんのコメント...

こんにちは。
最近、こんな記事を書きました。
http://shinichiaoyagi.blogspot.com/2011/05/wp7-scrollviewer.html
たぶん、内部でやってることはまったく同じなので紹介するまでも無いんですけどね(笑)

kazuaki さんのコメント...

青柳さん こんばんは。

ブログ拝見しました。
まさか標準でできるとは思いませんでした、Silverlight ちゃんと勉強しないといけませんね...

ただ、このやり方でも DependencyPropertyListener を使ったやり方でもスクロールが遅い問題はかわらないようです。
Mango までは 一番最初の MORE ボタン方式に戻すことにしました。