Material Design In XAML Tool Kit のデモプログラムでは、左上のメニューアイコンでサイドメニューが表示されます。
これは、Colour Zones と Drawer を組み合わせて実現できますが、具体的なサンプルコードが見つからなかったので、3つのパターンを作ってみました。
テンプレートとして活用できるようにしていますので、コピペして利用して頂ければ幸いです。
Material Design In XAML Tool Kit の詳しい使い方については「 【WPF】material designとC#で作るモダンUI入門」の記事で紹介していますので、併せてご確認下さい。
Magerial Design In XAML ToolKit の Colour ZonesとDrawer について
Colour Zones は、一般的には 色分けされた領域 または カラーゾーン と呼ばれ、視覚的な区別や、機能的な区別をするという役割を持っています。
ちなみに、Color Zones ではなく Colour Zone と記載されているのは、Color の英語表記が Colour であるからです。Magerial Design In XAML ToolKit は英国生まれであるため、 Colour が使われています。
Drawerは引き出しのことですが、ナビゲーションメニュー(普段は画面端に隠れており、スワイプやタップで引き出すことができるメニュー)という意味も使われています。
Drawer の構造
Drawer が分かり難いので、XAML上の構造を図にしました。DrawerHostの中にDrowerContent(ナビゲーションメニュー)とDrawer部に表示するUIレイアウトを記述します。
DrowerContentoは上下左右に配置可能で、それぞれ LeftDrawerContent、TopDrawerContent、RightDrawerContent、BottomDrawerContent のタグが用意されています。
XAML上では、Command を使ってナビゲーションメニューを開閉することが可能で、CommandParameter で対象となる部位(上下左右)を指定します。
1 2 3 4 5 6 7 |
// 左のナビゲーションメニューを表示する Command="{x:Static materialDesign:DrawerHost.OpenDrawerCommand}" CommandParameter="{x:Static Dock.Left}" // 下部のナビゲーションメニューを閉じる Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" CommandParameter="{x:Static Dock.Bottom}" |
一方、C#のコードからは、IsLeftDrawerOpen、IsTopDrawerOpen、IsRightDrawerOpen、IsBottomDrawerOpen の4つのプロパティが用意されており、それぞれ true / false で開閉が指定できます。
MaterialDesignDemo 互換のナビゲーションメニューを実現する
Material Design In XAMLの公式サイトで公開されているデモプログラム「MaterialDesignDemo.exe」と同じ動作をさせたい場合、次のXAMLで実現可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
<Window x:Class="DesignTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DesignTest" mc:Ignorable="d" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" TextElement.Foreground="{DynamicResource MaterialDesignBody}" Background="{DynamicResource MaterialDesignPaper}" TextElement.FontWeight="Medium" TextElement.FontSize="14" FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto" Title="MainWindow" Height="450" Width="800"> <Grid> <!-- Drawer全体のデザインを記述--> <materialDesign:DrawerHost x:Name="DrawerHost" BorderBrush="{DynamicResource MaterialDesignDivider}" BorderThickness="2" BottomDrawerBackground="{DynamicResource SecondaryHueLightBrush}" BottomDrawerCornerRadius="20 20 0 0" DrawerClosing="DrawerHost_DrawerClosing"> <materialDesign:DrawerHost.Style> <Style TargetType="materialDesign:DrawerHost" BasedOn="{StaticResource {x:Type materialDesign:DrawerHost}}" > <Style.Triggers> <DataTrigger Binding="{Binding IsChecked, ElementName=BackgroundToggle}" Value="True"> <Setter Property="OverlayBackground" Value="{DynamicResource PrimaryHueMidBrush}" /> </DataTrigger> </Style.Triggers> </Style> </materialDesign:DrawerHost.Style> <!-- ナビゲーションメニューとメニュー選択時の動作を記述--> <materialDesign:DrawerHost.LeftDrawerContent> <StackPanel Margin="16" > <!-- ナビゲーションメニューを閉じる --> <ToggleButton x:Name="CloseMenu" HorizontalAlignment="Right" IsChecked="{Binding ElementName=OpenMenu, Path=IsChecked}" Click="Button_Click" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" CommandParameter="{x:Static Dock.Left}" Style="{StaticResource MaterialDesignHamburgerToggleButton}" /> <!-- メニュー項目1 --> <Button Margin="4" HorizontalAlignment="Center" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" CommandParameter="{x:Static Dock.Left}" Content="メニュー項目1" Click="Button_Click" Style="{StaticResource MaterialDesignFlatButton}" /> <!-- メニュー項目2 --> <Button Margin="4" HorizontalAlignment="Center" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" Content="メニュー項目2" Click="Button_Click" Style="{StaticResource MaterialDesignFlatButton}" /> </StackPanel> </materialDesign:DrawerHost.LeftDrawerContent> <!-- メインのコンテンツを記述 --> <Grid> <!-- ナビゲーションメニューを表示するためのトグルボタン --> <materialDesign:ColorZone Padding="16" materialDesign:ElevationAssist.Elevation="Dp4" ClipToBounds="False" CornerRadius="10" Mode="PrimaryDark"> <StackPanel Orientation="Horizontal"> <ToggleButton x:Name="OpenMenu" Command="{x:Static materialDesign:DrawerHost.OpenDrawerCommand}" CommandParameter="{x:Static Dock.Left}" Style="{StaticResource MaterialDesignHamburgerToggleButton}" /> <TextBlock Margin="16,0,0,0" VerticalAlignment="Center" Text="Material Design In XAML Toolkit" /> </StackPanel> </materialDesign:ColorZone> <!-- メインのコンテンツを記述 --> <Grid> <TextBlock Width="200" Height="20" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Text="ここにコントロールを配置する"/> </Grid> </Grid> </materialDesign:DrawerHost> </Grid> </Window> |
ナビゲーションメニューがクリックされた時、及びDrawer領域がクリックされた時にメニューが閉じるのですが、そのタイミングでColour Zone のメニューボタン(ToggleButton x:Name="OpenMenu" )の IsChecked を False に設定したいので、そのためのイベントハンドラ(Button_Click、DrawerHost_DrawerClosing)を記述しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace DesignTest { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } /// <summary> /// メニュー項目ボタンクリック時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click(object sender, RoutedEventArgs e) { OpenMenu.IsChecked = false; } /// <summary> /// DrawerHostをクリックされた時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DrawerHost_DrawerClosing(object sender, MaterialDesignThemes.Wpf.DrawerClosingEventArgs e) { DrawerHost.IsLeftDrawerOpen = false; OpenMenu.IsChecked = false; } } } |
ナビゲーションメニューの戻るボタンをタイトルに変更する
ナビゲーションメニューの閉じるボタンを無くしてタイトルを表示したい場合、XAMLを次の様に記述します。
C#側のコードは先ほどと同様です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<Window x:Class="DesignTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DesignTest" mc:Ignorable="d" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" TextElement.Foreground="{DynamicResource MaterialDesignBody}" Background="{DynamicResource MaterialDesignPaper}" TextElement.FontWeight="Medium" TextElement.FontSize="14" FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto" Title="MainWindow" Height="450" Width="800"> <Grid> <!-- Drawer全体のデザインを記述--> <materialDesign:DrawerHost x:Name="DrawerHost" BorderBrush="{DynamicResource MaterialDesignDivider}" BorderThickness="2" BottomDrawerBackground="{DynamicResource SecondaryHueLightBrush}" BottomDrawerCornerRadius="20 20 0 0" DrawerClosing="DrawerHost_DrawerClosing"> <materialDesign:DrawerHost.Style> <Style TargetType="materialDesign:DrawerHost" BasedOn="{StaticResource {x:Type materialDesign:DrawerHost}}" > <Style.Triggers> <DataTrigger Binding="{Binding IsChecked, ElementName=BackgroundToggle}" Value="True"> <Setter Property="OverlayBackground" Value="{DynamicResource PrimaryHueMidBrush}" /> </DataTrigger> </Style.Triggers> </Style> </materialDesign:DrawerHost.Style> <!-- 左Drawerを表示させた時のメニューとメニューを選択した時の動作を記述--> <materialDesign:DrawerHost.LeftDrawerContent> <StackPanel Margin="16" > <TextBlock Margin="4" HorizontalAlignment="Center" Text="メニュータイトル" /> <!-- メニュー項目1 --> <Button Margin="4" HorizontalAlignment="Center" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" CommandParameter="{x:Static Dock.Left}" Content="メニュー項目1" Click="Button_Click" Style="{StaticResource MaterialDesignFlatButton}" /> <!-- メニュー項目2 --> <Button Margin="4" HorizontalAlignment="Center" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" Content="メニュー項目2" Click="Button_Click" Style="{StaticResource MaterialDesignFlatButton}" /> </StackPanel> </materialDesign:DrawerHost.LeftDrawerContent> <!-- メインのコンテンツを記述 --> <Grid> <!-- 左Drawer を表示するためのトグルボタン --> <materialDesign:ColorZone Padding="16" materialDesign:ElevationAssist.Elevation="Dp4" ClipToBounds="False" CornerRadius="10" Mode="PrimaryDark"> <StackPanel Orientation="Horizontal"> <ToggleButton x:Name="OpenMenu" Command="{x:Static materialDesign:DrawerHost.OpenDrawerCommand}" CommandParameter="{x:Static Dock.Left}" Style="{StaticResource MaterialDesignHamburgerToggleButton}" /> <TextBlock Margin="16,0,0,0" VerticalAlignment="Center" Text="Material Design In XAML Toolkit" /> </StackPanel> </materialDesign:ColorZone> <!-- メインのコンテンツを記述 --> <Grid> <TextBlock Width="200" Height="20" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Text="ここにコントロールを配置する"/> </Grid> </Grid> </materialDesign:DrawerHost> </Grid> </Window> |
Colour Zones の真下に Drawer を配置する
Colour Zones の真下に Drawer を配置する(Drawer表示時にColour Zonesが隠れないようにする)には、次のようにXAMLを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
<Window x:Class="DesignTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DesignTest" mc:Ignorable="d" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" TextElement.Foreground="{DynamicResource MaterialDesignBody}" Background="{DynamicResource MaterialDesignPaper}" TextElement.FontWeight="Medium" TextElement.FontSize="14" FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto" Title="MainWindow" Height="450" Width="800"> <Grid> <DockPanel LastChildFill="True"> <!-- 左Drawer を表示するためのトグルボタン --> <materialDesign:ColorZone DockPanel.Dock="Top" Padding="16" materialDesign:ElevationAssist.Elevation="Dp4" ClipToBounds="False" CornerRadius="10" Mode="PrimaryDark"> <StackPanel Orientation="Horizontal"> <ToggleButton x:Name="OpenMenu" Style="{StaticResource MaterialDesignHamburgerToggleButton}" Click="OpenMenu_Click"/> <TextBlock Margin="16,0,0,0" VerticalAlignment="Center" Text="Material Design In XAML Toolkit" /> </StackPanel> </materialDesign:ColorZone> <!-- Drawer全体のデザインを記述--> <materialDesign:DrawerHost x:Name="DrawerHost" DrawerClosing="DrawerHost_DrawerClosing" BorderBrush="{DynamicResource MaterialDesignDivider}" BorderThickness="2" BottomDrawerBackground="{DynamicResource SecondaryHueLightBrush}" BottomDrawerCornerRadius="20 20 0 0" > <materialDesign:DrawerHost.Style> <Style TargetType="materialDesign:DrawerHost" BasedOn="{StaticResource {x:Type materialDesign:DrawerHost}}" > <Style.Triggers> <DataTrigger Binding="{Binding IsChecked, ElementName=BackgroundToggle}" Value="True"> <Setter Property="OverlayBackground" Value="{DynamicResource PrimaryHueMidBrush}" /> </DataTrigger> </Style.Triggers> </Style> </materialDesign:DrawerHost.Style> <!-- 左Drawerを表示させた時のメニューとメニューを選択した時の動作を記述--> <materialDesign:DrawerHost.LeftDrawerContent> <StackPanel Margin="16" > <TextBlock Margin="4" HorizontalAlignment="Center" Text="メニュータイトル" /> <!-- メニュー項目1 --> <Button Margin="4" HorizontalAlignment="Center" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" CommandParameter="{x:Static Dock.Left}" Content="メニュー項目1" Click="Button_Click" Style="{StaticResource MaterialDesignFlatButton}" /> <!-- メニュー項目2 --> <Button Margin="4" HorizontalAlignment="Center" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" Content="メニュー項目2" Click="Button_Click" Style="{StaticResource MaterialDesignFlatButton}" /> </StackPanel> </materialDesign:DrawerHost.LeftDrawerContent> <!-- メインのコンテンツを記述 --> <Grid> <TextBlock Width="200" Height="20" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Text="ここにコントロールを配置する" /> </Grid> </materialDesign:DrawerHost> </DockPanel> </Grid> </Window> |
ナビゲーションメニューを表示するボタンを materialDesign:DrawerHost の外側に記述すると
Command="{x:Static materialDesign:DrawerHost.OpenDrawerCommand}"
が呼び出せなくなります。
そこで、OpenMenu_Click イベントハンドラを新たに追加し、DrawerHost.IsLeftDrawerOpen プロパティにOpenMenu.IsChecked の値を代入することで、ナビゲーションメニューを表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
using MaterialDesignThemes.Wpf; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace DesignTest { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } /// <summary> /// メニュー項目ボタンクリック時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click(object sender, RoutedEventArgs e) { OpenMenu.IsChecked = false; } /// <summary> /// メニューボタンクリック時の左Draw表示/非表示 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OpenMenu_Click(object sender, RoutedEventArgs e) { DrawerHost.IsLeftDrawerOpen = OpenMenu.IsChecked??false; } /// <summary> /// DrawerHostをクリックされた時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DrawerHost_DrawerClosing(object sender, MaterialDesignThemes.Wpf.DrawerClosingEventArgs e) { DrawerHost.IsLeftDrawerOpen = OpenMenu.IsChecked ?? false; } } } |
DrawHostをクリックされたときもメニューを閉じたい場合は、DrawerHost_DrawerClosing を次の通り変更します。
1 2 3 4 5 |
private void DrawerHost_DrawerClosing(object sender, MaterialDesignThemes.Wpf.DrawerClosingEventArgs e) { DrawerHost.IsLeftDrawerOpen = false; OpenMenu.IsChecked = false; } |
ナビゲーションメニュー表示中でもDrawerの内容を有効にする
これまでに紹介したものは、ナビゲーションメニューが表示されていると、Drawerがグレーになり、入力ができませんでした。
ナビゲーションメニューが表示中でもDrawerが利用できるようにし、かつ Colour Zones の閉じるボタンを押したときのみナビゲーションを閉じる(Drawerをクリックしても閉じない)ようにしたい場合、次のXAMLが使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
<Window x:Class="DesignTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DesignTest" mc:Ignorable="d" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" TextElement.Foreground="{DynamicResource MaterialDesignBody}" Background="{DynamicResource MaterialDesignPaper}" TextElement.FontWeight="Medium" TextElement.FontSize="14" FontFamily="pack://application:,,,/MaterialDesignThemes.Wpf;component/Resources/Roboto/#Roboto" Title="MainWindow" Height="450" Width="800"> <Grid> <DockPanel LastChildFill="True"> <!-- 左Drawer を表示するためのトグルボタン --> <materialDesign:ColorZone DockPanel.Dock="Top" Padding="16" materialDesign:ElevationAssist.Elevation="Dp4" ClipToBounds="False" CornerRadius="10" Mode="PrimaryDark"> <StackPanel Orientation="Horizontal"> <ToggleButton x:Name="OpenMenu" Style="{StaticResource MaterialDesignHamburgerToggleButton}" Click="OpenMenu_Click"/> <TextBlock Margin="16,0,0,0" VerticalAlignment="Center" Text="Material Design In XAML Toolkit" /> </StackPanel> </materialDesign:ColorZone> <DockPanel LastChildFill="True"> <!-- Drawer全体のデザインを記述--> <materialDesign:DrawerHost x:Name="DrawerHost" DockPanel.Dock="Left" DrawerClosing="DrawerHost_DrawerClosing" BorderBrush="{DynamicResource MaterialDesignDivider}" BorderThickness="2" BottomDrawerBackground="{DynamicResource SecondaryHueLightBrush}" BottomDrawerCornerRadius="20 20 0 0" > <materialDesign:DrawerHost.Style> <Style TargetType="materialDesign:DrawerHost" BasedOn="{StaticResource {x:Type materialDesign:DrawerHost}}" > <Style.Triggers> <DataTrigger Binding="{Binding IsChecked, ElementName=BackgroundToggle}" Value="True"> <Setter Property="OverlayBackground" Value="{DynamicResource PrimaryHueMidBrush}" /> </DataTrigger> </Style.Triggers> </Style> </materialDesign:DrawerHost.Style> <!-- 左Drawerを表示させた時のメニューとメニューを選択した時の動作を記述--> <materialDesign:DrawerHost.LeftDrawerContent> <StackPanel Margin="16" > <TextBlock Margin="4" HorizontalAlignment="Center" Text="メニュータイトル" /> <!-- メニュー項目1 --> <Button Margin="4" HorizontalAlignment="Center" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" CommandParameter="{x:Static Dock.Left}" Content="メニュー項目1" Click="Button_Click" Style="{StaticResource MaterialDesignFlatButton}" /> <!-- メニュー項目2 --> <Button Margin="4" HorizontalAlignment="Center" Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}" Content="メニュー項目2" Click="Button_Click" Style="{StaticResource MaterialDesignFlatButton}" /> </StackPanel> </materialDesign:DrawerHost.LeftDrawerContent> </materialDesign:DrawerHost> <!-- メインのコンテンツを記述 --> <Grid> <TextBlock Width="200" Height="30" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Text="ここにコントロールを配置する" /> </Grid> </DockPanel> </DockPanel> </Grid> </Window> |
メニューを選択してもナビゲーションメニューが閉じないようにするため、先ほど紹介したプログラムのButton_Clickイベントハンドラにある OpenMenu.IsChecked = false をコメントアウトしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
using MaterialDesignThemes.Wpf; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace DesignTest { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } /// <summary> /// メニュー項目ボタンクリック時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click(object sender, RoutedEventArgs e) { //左メニュー選択時にメニューを閉じたい場合は、次のコメントを外す //OpenMenu.IsChecked = false; } /// <summary> /// メニューボタンクリック時の左Draw表示/非表示 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OpenMenu_Click(object sender, RoutedEventArgs e) { DrawerHost.IsLeftDrawerOpen = OpenMenu.IsChecked??false; } /// <summary> /// DrawerHostをクリックされた時の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DrawerHost_DrawerClosing(object sender, MaterialDesignThemes.Wpf.DrawerClosingEventArgs e) { DrawerHost.IsLeftDrawerOpen = OpenMenu.IsChecked ?? false; } } } |
まとめ
Material Design In Tool Kit で用意されている Colour Zones と Drawer を使うことで、最近流行のMaterial Design っぽいナビゲーションメニューが実現できます。
今回は、Drawer の簡単な構造と、公式でもプログラム「MaterialDesignDemo.exe」のナビゲーションメニューの実現方法、そこから派生したナビゲーションメニューの派生パターンについて、合計4つのXAMLとC#コードを紹介しました。
Drawerは少々難しそうに見えますが、構造が分かってしまえばそんなに難しくありません。
Material Design In Tool Kit +WPF+C#で今風ナビゲーションメニューを実現したい方は、この記事を参考にしてください。
コメント