【Power Apps】ハンバーガーメニューをコンポーネントで作ってみた

# はじめに
Power Appsでハンバーガーメニューを作る記事はいくつかありますが、コンポーネントに作成した上で実用的な実装まで落とし込んだ記事が無かったので解説します。
最終的なイメージは以下のようになります。

![Animation3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/5606d3e7-5233-97f5-fe85-44ad8a4425f9.gif)

私自身、Power Appsで「原神」というゲームの育成素材管理アプリをPower Appsで作成しており、このハンバーガーメニューが非常に役立っています。（Paimon.moeでよくねは禁句）

![image-3-1024x574.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/bab916b6-fb4c-13d1-6407-03f20427a317.png)

# 作成手順
## コンポーネントの作成

ツリービューより、コンポーネントを作成します。

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/7db5872a-1252-fa8b-481d-2fc17268f302.png)

作成時のコンポーネントサイズはアプリサイズと異なっているのでWidthとHeightを設定します。

![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/07c1a6fd-455a-a508-ed3b-b814e7ee5679.png)
![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/51549b38-9a0b-60d7-ca43-e7b48ed9e899.png)

```
Width = App.Width
Height = App.Height
```

## メニューアイコン配置
ヘッダーにあたる四角形とハンバーガーメニューアイコンを画面上部に追加します。

![image-9-1024x321.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/8c80bbf2-bdec-65de-6872-9904204af9bf.png)

## ギャラリー作成
次にメニュー本体に用いる「垂直ギャラリー」を配置します。

![image-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/aefc682e-9b6e-cca8-dc4c-0f3316df9925.png)


### ギャラリー用データ作成

「Items」プロパティにハンバーガーメニューに表示したいアイコンと表示名のコレクションを入力します。
※screenは一時的にBlank()にしていますが、後の手順でカスタムプロパティのスクリーンを指定します。

![image-11-1024x614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/e1eff261-6593-48f8-c745-9a0b2edfc3fa.png)

```
Table(
    {
        icon: Icon.Home,
        display: "ホーム",
        screen: Blank()
    },
    {
        icon: Icon.AddUser,
        display: "ユーザー追加",
        screen: Blank()
    },
    {
        icon: Icon.AddLibrary,
        display: "アイテム追加",
        screen: Blank()
    },
    {
        icon: Icon.Notebook,
        display: "一覧表示",
        screen: Blank()
    }
)
```

ギャラリーにデフォルトで入っているものを削除し、いい感じの配置に変更します。<br>ここでは先ほど追加したItemsに合わせてラベルとアイコンを追加しました。

![image-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/569e2081-1063-015b-034c-a0cc0014bdba.png)

アイコンはプロパティの「Icon」を「ThisItem.icon」とすることで、Itemsに入力した任意のアイコンを動的に指定することができます。

![image-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/cee500a9-7414-a1d8-1a62-b7d87fbb810f.png)


### 遷移先画面指定

先ほどBlank()にしていた部分に値を追加していきます。ここにはNavigate関数の引数となる画面情報が必要になります。画面情報はコンポーネントのカスタムプロパティをデータ型を「画面」で作成することで指定できます。

![image-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/e7aedcd9-9c3e-5832-a978-ad1b6ede004c.png)

メニューから遷移したい画面分作成します。

![image-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/5d5f33c6-616f-c9ea-47b2-e8334f87ba41.png)

ギャラリーのItemsプロパティに戻り、各Itemのscreenの値を追加したカスタムプロパティ値に変更します。

![image-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/2c4c05f3-192e-fd47-2a70-34aea353eb05.png)

### 画面遷移処理追加

次に、Itemsのscreenに指定した画面へ遷移する処理を追加します。
ギャラリーのOnSelectに画面遷移を行うNavigate処理を追加します。このとき、遷移先は先ほどギャラリーデータに追加したThisItem.screenを利用することで動的に追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/adb07e2f-e623-7af0-e22a-66eedd6280a2.png)

```
Table(
    {
        icon: Icon.Home,
        display: "ホーム",
        screen: 'Header Component'.HomeScreen
    },
    {
        icon: Icon.AddUser,
        display: "ユーザー追加",
        screen: 'Header Component'.AddUserScreen
    },
    {
        icon: Icon.AddLibrary,
        display: "アイテム追加",
        screen: 'Header Component'.AddItemScreen
    },
    {
        icon: Icon.Notebook,
        display: "一覧表示",
        screen: 'Header Component'.ListViewScreen
    }
)
```

:::note Tips

ギャラリーのOnSelectプロパティに直接Navigate()を記載してもよいですが、マウスオーバーした際にアイコンと文字でカーソルが変わってしまいます。

![image-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/969f5420-b1aa-e364-92b6-f09a1c7c8d07.png)![image-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/76e9f241-b3a3-6654-8d78-17c5abaa9b67.png)

以下のように透明のボタンを配置することでマウスポインターを一定にすることができます。

アイコン、ラベルの上にボタンを配置
![image-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/6581d217-2bd9-cb6f-f01d-1c16d98d1ee7.png)
ボタンを透明化
![image-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/8111fdce-31a7-c2bc-95d4-f10e3c409f1c.png)
:::

## 表示/非表示フラグ追加

ハンバーガーメニューアイコンをクリックすることでメニュー部の表示/非表示を切り替える処理を追加します。
出力型でハンバーガーメニュー表示フラグを持つカスタムプロパティを作成します。

![image-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/2fc22e0d-3566-c700-ec94-5cea4e6d62ab.png)

アイコンのOnSelectプロパティに表示フラグを持つグローバル変数をSet関数で定義します。

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/65f15d31-042d-c009-81ac-3614baa9be6e.png)

```
Set(isVisibleHamburgerMenu, !isVisibleHamburgerMenu)
```

画面遷移後にハンバーガーメニューを自動で閉じたい場合、ギャラリーのOnSelectプロパティに表示フラグをfalseにするコードを追加します。

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/dec25682-a5b0-7169-a54a-41d0828c0b9e.png)

```
Navigate(ThisItem.screen);
Set(isVisibleHamburgerMenu, false);
```

最後に、カスタムプロパティにグローバル変数の値を参照するように指定します。

![image-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/06da7f43-6f85-05a2-6f12-67e00d7a2631.png)

## 画面にコンポーネントを追加

次に、作成したコンポーネントを画面側に追加していきます。
**コンポーネントは常に最前面に配置してください。上に別のオブジェクトを配置すると機能しなくなります。**

![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/8bb0e465-3926-cd5c-3a14-2911623f4d25.png)

### 遷移先画面情報追加

コンポーネントのカスタムプロパティに実際の画面情報を加えます。
遷移したい画面に合わせてプロパティを設定していきます。この設定が完了すると、アイコンを押下することで各画面に遷移することができます。

![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/d2289095-3c99-513a-c13c-d9e9f910a536.png)

![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/c5e49aab-b18b-148b-190e-89a7bbb84736.png)

![image-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/d67b6e21-b137-646e-470c-192c05c6d61c.png)

### 表示・非表示切り替え処理追加

表示フラグを持つグローバル変数の値に応じて、コンポーネントの高さを制御することで表示・非表示を切り替えます。
画面に追加したコンポーネントのHeightプロパティを以下のように指定します。

![image-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/edfa97db-33be-cca8-272f-a8a9ffe56339.png)

```
If(
    cmpHambugerMenuHS.IsVisibleHambugerMenu,
    App.Height,
    55 // コンポーネントのヘッダ部と同じ値
)
```

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/bcf6c00f-16bf-0cb0-037b-106e8d582052.gif)

ここまでの操作を各画面に行うことで以下のような画面遷移を行うことができるようになります。

![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551355/516dd992-15a8-646f-76e5-d77c2217730a.gif)

コンポーネントに対する設定や画面追加後に指定が必要なプロパティが多いですが、ユーザーライクなハンバーガーメニューをPower Appsで作成することができました。