前回までのプログラムを動かした方なら、
起動時に各タイムラインが20個程度しか読み込んでくれないことに気づいたと思います。
twitterのAPIにパラメータを加えてリクエストすることで
取得件数を変えることができます。
取得件数のためにcountパラメータを使います。
ただし、毎回100件とか取得するのも無駄なので、
2回目以降のアクセスにはsince_idを使います。
since_idに前回取得した最新のidを入れておくと
それ以降のIdのつぶやきを取得できます。
ちなみにSearch APIはパラメータが違うので処理を共通化するのが難しいです。
そのため今回は何もせず今まで通り取得します。
というわけで、Twitterの方のタイムラインのためにTimelineクラスから派生したクラスを作ります。
UpdateをvirtualにしてTwitterTimelineクラスで以下のように実装しました。
public override void Update() { RequestParameter[] parameters; if (sinceId.HasValue) { parameters = new RequestParameter[] {new RequestParameter("since_id", sinceId.Value.ToString())}; } else { parameters = new RequestParameter[] {new RequestParameter("count", _startupReadCount.ToString()) }; } using (var response = WebUtility.GetResponse(_url, "GET", parameters, UserInfo)) { var stream = response.GetResponseStream(); var result = _itemsReader.Read(stream); foreach (var item in result) { if (!AllItems.Contains(item)) { OnReadNewItem(item); if (sinceId == null || item.Id > sinceId) { sinceId = item.Id; } } } }
単純にsinceIdに値が入っていたらそれをパラメータとして
なかったらcountをパラメータとして渡すようにしただけです。
ただサブクラスから親クラスのイベントは呼べないので、
OnReadNewItem()というprotectedメソッドを作って親クラスで処理しています。
ちなみにsinceIdが古すぎたりしたらエラーがでると仕様書にありますが、
前にも書いたとおり、しばらくは、blogが長くなりそうな処理は省いています。
あとはOptionDialogで初期読込数を指定できるように変更指定しています。
XAMLがこんな感じになりました。
見栄え(テキストの上下寄せ(Alignment)など)を調整するのに苦労しました。
よく忘れて混乱するのですが、TextBlockのVerticalAlignmentをcenterにしただけでは、
横のTextBoxに対して垂直位置が真ん中に来ません。
言葉で伝わるかどうかはわかりませんが、
TextBlockのVerticalAlignmentはTextBlockが持つ領域の中で
テキストを上下のどこに表示するかです。
デフォルトではTextBlockの領域(高さ)はテキストのちょうどの大きさしか持たないので、
TextBlock自体が下に置かれている状態では、なんの変化もありません。
というわけで、TextBlockの領域が、WrapPanelの1行の高さをすべて使うように
WrapPanelをVerticalAlignment="Stretch"としてTextBlockを広げています。
あとはオプションが増えて折り返しが必要になったのでWrapPanelを使って、
改行されたくないところはStackPanelで囲っています。
ちなみに、どれがどの領域を持っているかはsnoopなどのツールを使うとわかるかもしれません。
最後にTimelineを生成するときにTypeによってはTwitterTimelinを生成するようにしました。
今回のソースコードはこちら。
http://wtwitter.codeplex.com/SourceControl/changeset/view/42546
0 件のコメント:
コメントを投稿