2013年2月8日金曜日

【WinRT】Buttonをクリックしたときにボタンの下にポップアップを出す

いや別に下じゃなくてもいいんだけどね
日経新聞の上部バークリックして出てくるこのポップアップとか

SkyDriveのアプリバーから出てくるポップアップとか


どうやったら動的に位置を変動させてポップアップを表示させてるのかと思っていた.
コントロールの座標ってとれないしね.

っと思ってたんだが,ちょっとした方法でクリックしたコントロールの座標が取れた.
ButtonのOnClick時に呼ばれるハンドラ
TappedEventHandlerデリゲート
まぁあまりこのデリゲート自体には意識はしてないと思うんだけど
こいつには引数が2つ.
objectとTappedRoutedEventArgs.
このTappedRoutedEventArgsにGetPositionというメソッドがあった.

このTappedRoutedEventArgs::GetPositionというメソッドはどういうもんかというと
コントロールをTapした位置を引数に与えたコントロールの座標軸で返してくれるというもの.
たとえばTapしたButtonを引数に与えてGetPositionすると

こういうことである.

便利なのか不便なのかよくわからないメソッドではあるが,これを駆使することで
Tapしたコントロールの現座標を取得することができる.

まずXAMLを大まかにだがこういう構成にしてやる

つまり,クリックしてポップアップを表示させたいButtonと
一番ベースとなっているGridとに名前を付ける.
このベースとなっているGridは画面全体を表しているのがポイント.

そしてそのButtonをクリックしたときのメソッドで

ベースGridとButtonとそれぞれからGetPositionをして
X座標,Y座標それぞれで減算をしてやればいい.
「Gridの原点」=「画面の原点」なのでこの減算結果が座標となる.

あとはこの座標を元にPopupを表示させてやればOK.
ならないとは思うが負の値にならないよう念の為に
Math.Max()で最低値を設定してやるのが漢のマナー.
できればWindowサイズも取得してそこを超えないようにもしたい.


このエントリのコードは適当に書いてるので意図だけ汲んでいただければ.
このコードのままだとボタンの原点座標(ボタンの左上角)と同位置にポップアップが出てくることになるので
Y座標までわざわざ合わさずにY座標は固定orある程度の値を加算することになると思う.
そこは状況に応じて柔軟に.

0 件のコメント:

コメントを投稿