UWPでTabPageを表示する

#UWPのTabViewコントロールの使い方　
[サンプルコード](https://github.com/Yuki4-dev/TabView_Sample.git "コード")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/034d421f-98cb-c16f-963b-19b3fa2e5435.png)
FormsではTabControl/TabPage、UWPではTabViewになっている。

#参照追加(NuGet)
最初に、TabViewを使用できるようにパッケージ追加する。
(NuGet パッケージ名：Microsoft.UI.Xamlで検索)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/1060a5fb-f5cb-d03b-08e3-37b671625f9c.png)

次に、追加したプロジェクトのApp.xamlに下記を追加

```App.xaml
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
```

#TabView　コード

```MainPage.xaml
<muxc:TabView
    x:Name="ContentTabView"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch">
</muxc:TabView>
```
この時点では、タブが1つもないTabViewが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/ed5cfe00-c94a-0612-57ba-581df1a95278.png)
##・タブ追加

```MainPage.xaml
<muxc:TabView
    x:Name="ContentTabView"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch">

    <muxc:TabView.TabItems>
        <muxc:TabViewItem Content="Hello TabView !!" Header="TabPage Xaml"  />
    </muxc:TabView.TabItems>

</muxc:TabView>
```
タブが表示される。
※TabViewはデフォルトでタイトルバーに表示されるが、別途設定が必要[こちら](https://qiita.com/Yuki4/items/5a055b895f42aab251fe "UWP タイトルバーにコントロール配置する方法")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/0a0ed741-84bf-c6ae-7c47-e373c1e1d1c1.png)
タブの×ボタンでタブを閉じたり、＋ボタンでタブを追加できる。
まだイベントを実装していないので、この時点では押しても特に何も起こらない。
タブの×ボタンを非表示にする場合はTabViewItemのIsClosableをfalseに設定する。

```MainPage.xaml
<muxc:TabViewItem Content="Hello TabView!!" Header="TabPage Xaml"  IsClosable="false"/>
```
タブの＋ボタンを非表示にする場会は、TabViewのIsAddTabButtonVisibleをfalseに設定する。

```MainPage.xaml
<muxc:TabView
    x:Name="ContentTabView"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch"
    IsAddTabButtonVisible="false">
```
##・タブ追加(コードビハインド)
GridのLoadedイベントハンドラーに追加

```MainPage.xaml.cs
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
    var item = new TabViewItem()
    {
        Header = "TabPage Code",
        Content = "Hello TabView!!"
    };
    ContentTabView.TabItems.Add(item);
}
```
ここまではタブを選択したり、＋ボタンを押せない。
TabViewはタイトルバー上に表示されるので、別途タイトルバーを設定し、各コントロールがマウスフォーカスを受け取れるようにする必要がある。
そこで、TabViewにフッターを作成しタイトルバーに設定する。

##・フッターを作成

```MainPage.xaml
<muxc:TabView.TabStripFooter>
    <StackPanel
        x:Name="TitleBar"
        Background="Transparent"
        Orientation="Horizontal">
        <TextBlock
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            FontSize="18"
            Text="TabView Fotter" />
    </StackPanel>
</muxc:TabView.TabStripFooter>
```
作成したフッターをタイトルバーに設定する。

```MainPage.xaml.cs
Window.Current.SetTitleBar(TitleBar);
```

フッターが追加され、タブが選択できるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/014c2f8a-2490-50b3-ca6e-c1ce1438facb.png)

##・DataTemplate
TabViewはListViewと同じようにデータテンプレートを使用できる。

バインドするクラスを作成

```TabItemInfo.cs
public class TabItemInfo
{
    public string Hedder { get; set; }
    public Frame ContentPage { get; set; }
    public TabItemInfo(){ }
}
```

下記でデータテンプレートを設定する。

```MainPage.xaml
<muxc:TabView
    x:Name="ContentTabView"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch"
    TabItemsSource="【バインドするItemsSourceプロパティ名】">

    <muxc:TabView.TabItemTemplate>
        <DataTemplate x:DataType="local:TabItemInfo">
            <muxc:TabViewItem Content="{x:Bind ContentPage, Mode=OneWay}" Header="{x:Bind Hedder, Mode=OneWay}" />
        </DataTemplate>
    </muxc:TabView.TabItemTemplate>

</muxc:TabView>
```
##・イベント追加
タブのボタンイベントやドラッグイベントを追加する。

###タブの追加ボタン(＋ボタン)押下イベント

```MainPage.xaml
<muxc:TabView
    ...
    AddTabButtonClick="ContentTabView_AddTabButtonClick">
</muxc:TabView>
```
###タブの閉じるボタン(×ボタン)押下イベント

```MainPage.xaml
<muxc:TabView
    ...
    TabCloseRequested="ContentTabView_TabCloseRequested"
</muxc:TabView>
```
###ドラッグイベント
下記のプロパティにtrueを設定することで、ドラッグ操作でタブを並び替えることができる。
なお、独自にDataTemplateを実装している場合、ドラッグで並び替えようとするとエラーが発生する。

```MainPage.xaml
<muxc:TabView
    ...
    CanDragTabs="true"
    CanReorderTabs="true"
</muxc:TabView>
```
###タブをTabViewの外にドロップした場合
タブをドロップした場所で新しいウィンドウを開くなどしたいときに便利。

```MainPage.xaml
<muxc:TabView
    ...
    TabDroppedOutside="ContentTabView_TabDroppedOutside"
</muxc:TabView>
```

まとめ
---
マイクロソフト　TabView
https://docs.microsoft.com/ja-jp/windows/uwp/design/controls-and-patterns/tab-view

XamlControlsGallery　TabView
https://github.com/microsoft/Xaml-Controls-Gallery/tree/master/XamlControlsGallery/TabViewPages