Windows Phoneアプリ開発には半ば必須となっているSilverlight Toolkit。
いつの間にかPhone用みたいな扱いになっていますが、元はPC用Silverlightの拡張ライブラリなわけで、Silverlight2の頃から利用してたりします。
そういう意味ではSilverlightベースの開発全般において必須なライブラリなわけですが、WPアプリ開発を進めていく中でいくつかの細かい不具合に遭遇したのでメモっておきます。
付箋紙アプリでも文字サイズの調整などに使っているSliderコントロールですが、何かの拍子にスムーズにスライドできなくなる現象に遭遇。
色々と調べてみると、ピクチャー取込用のページで画像の移動やリサイズをジェスチャーで行うために使っていたGestureListnerのインスタンスを生成すると挙動不審になることが判明。
仕方ないので、Manipulation系のイベントを拾って凌ぐことにしたわけですが、なにぶんグラフィックの扱いには慣れておらず納得のいく動きになるまでエラい時間がかかりました。
さらに、先日ちょっとした機能追加をしていたらば、またもやスライダーが挙動不審に…
これまた色々といじった部分を調べたところ、どうやらContextMenuが悪さをしている様子。
試しに、元々パノラマのページに入れてあるContextMenuを開いてからスライダーを操作してみると、バッチリ再現。
Toolkit付属のサンプルアプリでも再現しちゃいます。
仕方ないので、機能追加する箇所ではContextMenuを使わないようにしましたが、パノラマページでのContextMenu廃止はちょっぴり難アリと思い、ひとまず放置。
ContextMenuで出来る操作は編集ページに入ってからも可能なので、付箋紙アプリユーザの方は極力ContextMenuを使わないことをオススメしておきます…
何とか簡単に回避する術はないものかとContextMenuコントロールのソースも覗いてみましたが、スキル不足のためあっさり断念。Toolkitのバージョンアップ待ちですわw
こちらも付箋紙アプリの改修に伴って発見したのですが、Lockable PivotというPivotの派生コントロールがToolkitに含まれているのですが、標準のPivotコントロールをLockable Pivotに置き換えたところ、編集ページで付箋の完成形画像がうまく取得できないという事態が発生。
具体的にはGridに積み重ねたUIElement群をWriteableBitmapでJPEG化しているのですが、いったんピボットをロックしてしまうと非アクティブなPivotItemに含まれるUIElementをうまく画像化できない、といった症状。
全く何も出力されないわけではなく、背景色がなくなったり、テキストのスケールがおかしくなったりといった感じに画像化される感じ。
該当のPivotItemを再度表示してあければ回復するのですが、付箋紙の保存処理はどのピボットアイテムがアクティブであっても可能なため、このままでは使えません。
仕方ないので、LockablePivotのソースを紐解いてみたところ、ロック処理というのはPivot内のアイテムをアクティブなもの以外全てバッファ保持してから削除し、アンロック時に元に戻す、という割と大胆な手法を使っているようで、結果的に非表示アイテムの描画処理に影響を及ぼしている雰囲気。
何故LockablePivotを使いたかったのかというと、テキスト入力時にフリック操作をするとピボットアイテムが切り替わってしまうという問題があったためで、逆に言うとピボットページにTextBoxが配置してある場合はすべからくLockablePivotを使うべきという話だったりするのですが、今回はこれについても対応を断念、放置ですorz
付箋紙アプリでやろうとしていることがそれなりに特殊だったのでこの件はまともに影響を受けましたが、一般的な利用においてはそれほど問題にはならないかもしれません。
普通に使う場合は、TextBoxのGotFoucsイベントでロック、LostFocusイベントでアンロック、という感じでいけると思います。
以上、まだ使っているToolkitコントロールがあまりないので他にも色々あるかもしれませんが、おかしな挙動が発生した際に問題の切り分けを素早く行うために、どのコントロールをどのタイミングで追加したのか、きっちり把握しながら進めるのが吉かと思われ。