Power Apps ギャラリーの各アイテムにポップアップ(コンテキスト)メニューを出してみる

Power Appsギャラリーはとても便利なコントロールだけれど、いくつか不便な点もあって、その中の1つに「アイテムの座標が取得できない」というのがある。

そこで、「クリックされたアイテムの近くにポップアップメニューを出す」とかの実現が難しいのだけれど、今回それにチャレンジしてみたので、そのメモ。

スポンサーリンク

前提

まず、前提として

  • Power Appsはマウスの座標が取れない
  • ギャラリーは各アイテムの座標が取れない

というのがある。

なので、ギャラリーのアイテムがクリックされたときに、
そのアイテムの近くにポップアップを出す
というのが、ポップアップの座標計算ができないので、地味に実装が難しい。。。

そこで、今回は、
アイテムの座標がわからないなら、各アイテムにポップアップメニューを入れてしまおう!
みたいな感じでポップアップ表示チャレンジをしてみた!

完成図

こんなギャラリーがあって

ねこさんの「 … 」をクリックすると、ねこさんの横にポップアップが出て、

黒い部分をクリックしてポップアップを消したあと、

リスさんの「 … 」をクリックすると、りすさんのところでポップアップが出るようなイメージ。

ポップアップを出してみる

まずはポップアップの実装。前述の通り今回はポップアップを「ギャラリーのアイテム」の中に実装するので、イメージとしてはこんな感じ。

lblCalendar~Menuまでがポップアップの要素で、Screenが薄黒い膜。

ではまず、「 … 」を押したときの処理がこちら。

選択されたアイテムが一意に識別できる値(今回はメールアドレス)を、変数に入れるだけ。

続いてMenu(ただの四角形)の実装はこんな感じ。

Visibleにselected=ThisItem.Mailを入れることで、クリックされたアイテムのポップアップだけをVisibleにする。

また、Menuの大きさをドラッグドロップで調節すると、Power AppsのUIが無理やりMenuのサイズをアイテムの中に収めようとしてくるので、X,Y,Height,Widthをこちらで手入力してあげて、アイテムを跨いだメニューをつくる。

今回「チャットをする」や「予定を見る」の機能は実装していないけど、中身はこんな感じ。

VisibleをMenuのVisibleとバインドしてあげて、座標をMenuとの相対で指定してあげたくらい。

このラベルやアイコンのOnSelectに処理を書いてあげれば、機能が動くようになるはず。

黒い膜はこんな感じで実装。

黒い膜をギャラリーアイテムの外に置いてしまうと、Menuが押せなくなってしまうので、今回はアイテムの中に実装。

Visibleを「selected<>“”」にして、何かしらのMenuが出ているときは全てのアイテムに黒膜を表示する。

また、大きさは各アイテムを覆うように、TemplateHeightとTemplateWidthを使用。

黒膜クリック時は、変数を初期化してあげる。

これで、狙ったアイテムにポップアップが表示できるようになった!

問題!

さて、この実装だといくつか問題が生じる。

問題1:最後のアイテムを選択したとき

最後のアイテムをクリックすると、当然だけどメニューが切れて表示されてしまう。

回避策としては、

  • メニューがアイテム内に収まる(アイテムを跨がない)よう座標やサイズを設定
  • ギャラリーのItemsプロパティとLast関数を組み合わせて、一番最後のアイテムが選択されたときだけMenuの表示座標を変更

があるかな~という感じ。
個人的にアイテムを跨いだ方がかっこいい気がする(w)ので、2つ目の解決方法を今度試してみよう。

問題2:ギャラリーの外をクリックしてもポップアップが消えない

こんなとき、赤枠の中をクリックしてもポップアップは消えない。

ギャラリー外に何も実装していないのだから当然だけどw

とはいっても、スクリーン全体を覆う黒い膜をギャラリーの上に表示しちゃうと、ポップアップをクリックできない問題が発生する。

そこで、

  1. ギャラリー
  2. 黒い膜(全体用)
  3. 他のコントロール
  4. スクリーン

みたいな感じでレイヤーを実装して、全体用の黒い膜のOnSelectで変数(今回はselected)を初期化してあげれば、Menuは消えるはず!

問題3:スクロールしてもポップアップは消えない

これが今回、回避策を見つけれなかった問題。。。

こんな感じでポップアップを出して、

マウスホイールとかを操作すると、ポップアップが消えずにスクロールしてしまうorz

マウスホイールが効かなくなるようにするには、ギャラリーの上に四角形とかで膜を張ってあげる必要があるんだけど、そうするとメニューが押せなくなる問題。。。

スクロールバーにOnScrollChangeとかがあれば変数を初期化して消せるんだけど。。。

個人的にPower Appsは「スクロール関係が本当に優しくない!」と思いましたとさ。

コメント

タイトルとURLをコピーしました