トレーニング
モジュール
.NET MAUI XAML ページのレイアウトをカスタマイズする - Training
StackLayout と Grid を使用して、さまざまなデバイス全体で一貫したユーザー インターフェイスを作成します。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
Windows にはすべてのウィンドウに既定のタイトル バーが用意されており、アプリの個性に合わせてカスタマイズできます。 既定のタイトル バーは、いくつかの標準コンポーネントと、ウィンドウのドラッグやサイズ変更などのコア機能を備えています。
アプリのタイトル バー、許容されるタイトル バー領域のコンテンツ、推奨される UI パターンをカスタマイズする際のガイダンスについては、タイトル バーのデザインに関する記事を参照してください。
注意
この記事では、UWP と WinUI 2 を使用するアプリのタイトル バーをカスタマイズする方法について説明します。 Windows アプリ SDK と WinUI 3 を使用するアプリについては、Windows アプリ SDK の「タイトル バーのカスタマイズ」を参照してください。
UWP アプリを Windows アプリ SDK に移行することを検討している場合は、ウィンドウ機能移行ガイドを参照してください。 詳細については、「ウィンドウ機能の移行」を参照してください。
この一覧では、標準タイトル バーのコンポーネントについて説明します。
UWP アプリケーションでは、ApplicationView クラスと CoreApplicationView クラスのメンバーを使用してタイトル バーをカスタマイズできます。 必要なカスタマイズのレベルに基づいてタイトル バーの外観を段階的に変更する複数の API があります。
注意
UWP アプリのセカンダリ ウィンドウに使用される Windows.UI.WindowManagement.AppWindow クラスは、タイトル バーのカスタマイズをサポートしていません。 セカンダリ ウィンドウを使用する UWP アプリのタイトル バーをカスタマイズするには、ApplicationView で複数のビューを表示する」の説明に従って ApplicationView を使用します。
タイトル バーに適用できるカスタマイズには 2 つのレベルがあります。既定のタイトル バーに軽微な変更を適用する方法と、アプリのキャンバスをタイトル バー領域に拡張して完全なカスタム コンテンツを提供する方法です。
タイトル バーの色の変更などの簡単なカスタマイズの場合は、アプリ ウィンドウのタイトル バー オブジェクトのプロパティを設定して、タイトル バーの要素に使う色を指定できます。 この場合は、タイトル バーの他の部分 (アプリ タイトルの描画やドラッグ領域の定義など) は引き続きシステムが制御します。
もう 1 つのオプションは、既定のタイトル バーを非表示にし、独自のカスタム コンテンツに置き換えることです。 たとえば、テキスト、検索ボックス、またはカスタム メニューをタイトル バー領域に配置できます。 また、このオプションを使って、マイカなどの素材背景をタイトル バー領域に拡張する必要があります。
全面的なカスタマイズを行う場合は、タイトル バー領域に自分でコンテンツを配置する必要があります。また、ドラッグ領域を独自に定義することもできます。 キャプション コントロール (システムの閉じる、最小化、最大化の各ボタン) は引き続き利用可能であり、システムによって処理されますが、アプリ タイトルなどの要素は該当しません。 これらの要素は、アプリの必要に応じて自分で作成する必要があります。
タイトル バーの色、またはアイコンのみをカスタマイズする場合は、アプリ ウィンドウのタイトル バー オブジェクトのプロパティを設定できます。
既定では、タイトル バーにはアプリの表示名がウィンドウ タイトルとして表示されます。 表示名は、Package.appxmanifest
ファイルに設定されます。
タイトルにカスタム テキストを追加するには、次に示すように、ApplicationView.Title プロパティをテキスト値に設定します。
public MainPage()
{
this.InitializeComponent();
ApplicationView.GetForCurrentView().Title = "Custom text";
}
テキストはウィンドウ タイトルの前に追加され、"カスタム テキスト - アプリの表示名" として表示されます。 アプリの表示名なしでカスタム タイトルを表示するには、[Full customization](完全なカスタマイズ) セクションに示すように、既定のタイトル バーを置き換える必要があります。
この例は、ApplicationViewTitleBar のインスタンスを取得し、color プロパティを設定する方法を示しています。
このコードは、アプリの OnLaunched メソッド (App.xaml.cs) 内の Window.Activate の呼び出しの後か、アプリの最初のページに配置できます。
// using Windows.UI;
// using Windows.UI.ViewManagement;
var titleBar = ApplicationView.GetForCurrentView().TitleBar;
// Set active window colors
titleBar.ForegroundColor = Colors.White;
titleBar.BackgroundColor = Colors.Green;
titleBar.ButtonForegroundColor = Colors.White;
titleBar.ButtonBackgroundColor = Colors.SeaGreen;
titleBar.ButtonHoverForegroundColor = Colors.White;
titleBar.ButtonHoverBackgroundColor = Colors.DarkSeaGreen;
titleBar.ButtonPressedForegroundColor = Colors.Gray;
titleBar.ButtonPressedBackgroundColor = Colors.LightGreen;
// Set inactive window colors
titleBar.InactiveForegroundColor = Colors.Gainsboro;
titleBar.InactiveBackgroundColor = Colors.SeaGreen;
titleBar.ButtonInactiveForegroundColor = Colors.Gainsboro;
titleBar.ButtonInactiveBackgroundColor = Colors.SeaGreen;
タイトル バーの色を設定するときには、次の点に注意する必要があります。
null
に設定すると、既定のシステム色にリセットされます。Windows には、ユーザーが選んだアクセント カラーをタイトル バーに適用するオプションが用意されています。 タイトル バーの色を設定する場合は、すべての色を明示的に設定することをお勧めします。 これにより、ユーザー定義の色設定によって意図しない色の組み合わせが発生することがなくなります。
タイトル バーの全面的なカスタマイズを選択すると、アプリのクライアント領域が拡張され、タイトル バーの領域を含めてウィンドウ全体が対象になります。 キャプション ボタン (ウィンドウによって提供されます) を除き、ウィンドウ全体の描画と入力処理を独自に行う必要があります。
規定のタイトル バーを非表示にして、コンテンツをタイトル バー領域に拡張するには、ExtendViewIntoTitleBar プロパティを true
に設定します。 ご使用のアプリでは、このプロパティはアプリの OnLaunched
メソッド (App.xaml.cs) またはアプリの最初のページで設定できます。
ヒント
すぐにすべてのコードを確認するには、「完全なカスタマイズの例」セクションを参照してください。
この例は、CoreApplicationViewTitleBar を取得し、ExtendViewIntoTitleBar プロパティを true
に設定する方法を示しています。
using Windows.ApplicationModel.Core;
public MainPage()
{
this.InitializeComponent();
// Hide default title bar.
var coreTitleBar = CoreApplication.GetCurrentView().TitleBar;
coreTitleBar.ExtendViewIntoTitleBar = true;
}
ヒント
この設定は、アプリが閉じられ、再起動されたときに保持されます。 Visual Studio で 、ExtendViewIntoTitleBar
を true
に設定した後、デフォルトに戻す場合は、明示的に false
設定し、アプリを実行して永続化された設定を上書きする必要があります。
アプリをタイトル バー領域に拡張する場合は、タイトル バーの UI を定義し、管理する必要があります。 通常、これには少なくともタイトル テキストとドラッグ領域の指定が含まれます。 タイトル バーのドラッグ領域には、ユーザーがクリックとドラッグを使ってウィンドウを移動できる場所を定義します。 これは、ユーザーが右クリックしてシステム メニューを表示できる場所でもあります。
許容されるタイトル バーのコンテンツと推奨される UI パターンの詳細については、タイトル バーのデザインに関する記事を参照してください。
ドラッグ リージョンを指定するには、Window.SetTitleBar メソッドを呼び出し、ドラッグ リージョンを定義する UIElement を渡します。 (通常は、UIElement
は他の要素を含むパネルです。) ExtendViewIntoTitleBar
プロパティを true
に設定し、呼び出しを SetTitleBar
に対し有効にする必要があります。
ドラッグ可能なタイトル バー リージョンとしてコンテンツを Grid
に設定する方法を次に示します。 このコードは、アプリの最初のページの XAML と分離コードに含まれます。
<Grid x:Name="AppTitleBar" Background="Transparent">
<!-- Width of the padding columns is set in LayoutMetricsChanged handler. -->
<!-- Using padding columns instead of Margin ensures that the background
paints the area under the caption control buttons (for transparent buttons). -->
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="LeftPaddingColumn" Width="0"/>
<ColumnDefinition/>
<ColumnDefinition x:Name="RightPaddingColumn" Width="0"/>
</Grid.ColumnDefinitions>
<Image Source="Assets/WindowIcon.png"
Grid.Column="1"
HorizontalAlignment="Left"
Width="16" Height="16"
Margin="8,0,0,0"/>
<TextBlock x:Name="AppTitleTextBlock"
Text="App title"
Style="{StaticResource CaptionTextBlockStyle}"
Grid.Column="1"
VerticalAlignment="Center"
Margin="28,0,0,0"/>
</Grid>
public MainPage()
{
this.InitializeComponent();
var coreTitleBar = CoreApplication.GetCurrentView().TitleBar;
coreTitleBar.ExtendViewIntoTitleBar = true;
// Set XAML element as a drag region.
Window.Current.SetTitleBar(AppTitleBar);
}
既定では、システム タイトル バーには、アプリの表示名がウィンドウ タイトルとして表示されます。 表示名は Package.appxmanifest ファイルで設定されます。 この値を取得して、このようにカスタム タイトル バーで使用できます。
AppTitleTextBlock.Text = AppInfo.Current.DisplayInfo.DisplayName;
重要
指定するドラッグ リージョンは、ヒット テスト可能である必要があります。 既定では、Grid
などの一部の UI 要素は、背景が設定されていない場合にヒット テストに参加しないことがあります。 つまり、一部の要素では、透過的背景効果ブラシを設定する必要がある場合があります。 詳細については、VisualTreeHelper.FindElementsInHostCoordinates の解説を参照してください。
たとえば、ドラッグ リージョンとしてグリッドを定義する場合は、Background="Transparent"
をドラッグ可能に設定 します。
このグリッドはドラッグできません (ただし、その中に表示される要素は次のとおりです): <Grid x:Name="AppTitleBar">
。
このグリッドは同じように見えますが、グリッド全体をドラッグできます: <Grid x:Name="AppTitleBar" Background="Transparent">
。
ボタン、メニュー、検索ボックスなどの対話型コントロールをアプリの上部に配置して、タイトル バーにあるように見せることができます。 ただし、ユーザーがウィンドウを移動することを許可しながら対話型要素でユーザーによる入力を確実に受信できるようにするには、いくつかの規則に従う必要があります。
SetTitleBar
に渡される UIElement の子にしないでください。 要素を SetTitleBar
に渡すと、システムはそれをシステム タイトル バーのように扱い、その要素へのポインター入力をすべて処理します。ここでは、 AutoSuggestBox 要素の Z オーダーが AppTitleBar
よりも高いので、ユーザーによる入力を受け取ります。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="48"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid x:Name="AppTitleBar" Background="Transparent">
<!-- Width of the padding columns is set in LayoutMetricsChanged handler. -->
<!-- Using padding columns instead of Margin ensures that the background
paints the area under the caption control buttons (for transparent buttons). -->
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="LeftPaddingColumn" Width="0"/>
<ColumnDefinition/>
<ColumnDefinition x:Name="RightPaddingColumn" Width="0"/>
</Grid.ColumnDefinitions>
<Image Source="Assets/WindowIcon.png"
Grid.Column="1"
HorizontalAlignment="Left"
Width="16" Height="16"
Margin="8,0,0,0"/>
<TextBlock x:Name="AppTitleTextBlock"
Text="App title"
Style="{StaticResource CaptionTextBlockStyle}"
Grid.Column="1"
VerticalAlignment="Center"
Margin="28,0,0,0"/>
</Grid>
<!-- This control has a higher z-order than AppTitleBar,
so it receives user input. -->
<AutoSuggestBox QueryIcon="Find"
PlaceholderText="Search"
HorizontalAlignment="Center"
Width="260" Height="32"/>
</Grid>
アプリ ウィンドウの左上隅または右上隅は、システム キャプション ボタン (最小化、最大化/元に戻す、閉じる) 用に予約されています。 ウィンドウをドラッグ、最小化、最大化、および閉じるための最低限の機能を確保するために、キャプション ボタン領域の制御は、システムが保持します。 システムにより、左から右に記述する言語の場合は右上隅に、右から左に記述する言語の場合は左上隅に閉じるボタンが描画されます。
キャプション コントロール領域の背面に (たとえば背景として) コンテンツを描画することもできますが、ユーザーが操作するための UI は配置しないでください。 キャプション コントロールの入力はシステムによって処理されるため、入力は受け取りません。
前の例のこれらの行は、タイトル バーを定義する XAML のパディング列を示しています。 余白ではなくパディング列を使うと、キャプション コントロール ボタンの下の領域に確実に背景が描画されます (透明なボタンの場合)。 左右の両方のパディング列を使うと、右から左、左から右のどちらのレイアウトであっても、タイトル バーは正しく動作します。
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="LeftPaddingColumn" Width="0"/>
<ColumnDefinition/>
<ColumnDefinition x:Name="RightPaddingColumn" Width="0"/>
</Grid.ColumnDefinitions>
キャプション コントロール領域のサイズと位置は CoreApplicationViewTitleBar クラスによって伝達されるため、独自のタイトル バー UI のレイアウトでも、これを利用できます。 左右に予約されている領域の幅は SystemOverlayLeftInset または SystemOverlayRightInset プロパティで指定され、高さは Height プロパティで指定されます。
LayoutMetricsChanged イベントを処理して、キャプション ボタンのサイズの変更に応答できます。 たとえば、アプリのレイアウトが左から右から右から左に変更された場合に発生する可能性があります。 このイベントを処理して、タイトル バーのサイズに依存する UI 要素の配置を確認して更新します。
この例では、タイトル バーの指標の変更を考慮してタイトル バーのレイアウトを調整する方法を示します。 AppTitleBar
、LeftPaddingColumn
、および RightPaddingColumn
は、前に示した XAML で宣言されています。
private void CoreTitleBar_LayoutMetricsChanged(CoreApplicationViewTitleBar sender, object args)
{
// Get the size of the caption controls and set padding.
LeftPaddingColumn.Width = new GridLength(coreTitleBar.SystemOverlayLeftInset);
RightPaddingColumn.Width = new GridLength(coreTitleBar.SystemOverlayRightInset);
}
アプリのコンテンツをタイトル バー領域に拡張する場合、キャプション ボタンの背景を透明にして、アプリの背景が透けて見えるようにすることができます。 通常、完全に透明にするには、背景を Colors.Transparent に設定します。 部分的に透明にする場合は、プロパティを設定した Color のアルファ チャネルを設定します。
これらのタイトル バーのプロパティは透明にすることができます。
他のすべての color プロパティは引き続きアルファ チャネルを無視します。 ExtendViewIntoTitleBar
が false
に設定されている場合、すべての ApplicationViewTitleBar
color プロパティでアルファ チャネルは常に無視されます。
ボタンの背景色は、閉じるボタンの "ホバー" 時と "押下" 時の状態に適用されません。 それらの状態に対して、閉じるボタンには常にシステム定義の色が使われます。
ヒント
マイカは楽しい素材であり、フォーカスのあるウィンドウを区別するのに役立ちます。 Windows 11 で長時間使われるウィンドウの背景としてお勧めします。 ウィンドウのクライアント領域にマイカを適用した場合は、それをタイトル バー領域まで拡張し、マイカが透けて見えるようにキャプション ボタンを透明にすることができます。 詳細については、「マイカ素材」を参照してください。
ウィンドウがアクティブか非アクティブかをわかりやすくしてください。 少なくとも、タイトル バーのテキスト、アイコン、ボタンの色を変更するようにします。
CoreWindow.Activated イベントを処理してウィンドウのアクティブ化状態を判断し、必要に応じてタイトル バー UI を更新します。
public MainPage()
{
...
Window.Current.CoreWindow.Activated += CoreWindow_Activated;
}
private void CoreWindow_Activated(CoreWindow sender, WindowActivatedEventArgs args)
{
UISettings settings = new UISettings();
if (args.WindowActivationState == CoreWindowActivationState.Deactivated)
{
AppTitleTextBlock.Foreground =
new SolidColorBrush(settings.UIElementColor(UIElementType.GrayText));
}
else
{
AppTitleTextBlock.Foreground =
new SolidColorBrush(settings.UIElementColor(UIElementType.WindowText));
}
}
アプリの実行中に新しいタイトル バー要素に切り替えるには、SetTitleBar を呼び出すことができます。 既定のシステム タイトル バーに戻すには、パラメーターとして null
を SetTitleBar
渡し、ExtendViewIntoTitleBar を false
に設定します。
"全画面表示" または "コンパクト オーバーレイ" モードのサポートをアプリに追加する場合、アプリがこれらのモード間を切り替えるときに、必要に応じてタイトル バーを変更します。
アプリが "全画面" または "タブレット モード" (Windows 10 のみ) で実行されている場合は、タイトル バーとタイトル コントロール ボタンが非表示になります。 ただし、ユーザーがタイトル バーを呼び出し、アプリ UI の上にオーバーレイとして表示することもあります。
CoreApplicationViewTitleBar.IsVisibleChanged イベントを処理して、タイトル バーが非表示または呼び出されたときに通知を受け取り、必要に応じてカスタム タイトル バーのコンテンツを表示または非表示にすることができます。
この例は、前の例の IsVisibleChanged
イベントを処理して、AppTitleBar
要素を表示および非表示にする方法を示しています。
public MainPage()
{
this.InitializeComponent();
var coreTitleBar = CoreApplication.GetCurrentView().TitleBar;
// Register a handler for when the title bar visibility changes.
// For example, when the title bar is invoked in full screen mode.
coreTitleBar.IsVisibleChanged += CoreTitleBar_IsVisibleChanged;
}
private void CoreTitleBar_IsVisibleChanged(CoreApplicationViewTitleBar sender, object args)
{
if (sender.IsVisible)
{
AppTitleBar.Visibility = Visibility.Visible;
}
else
{
AppTitleBar.Visibility = Visibility.Collapsed;
}
}
注意
全画面モードには、アプリでサポートされている場合にのみ切り替えることができます。 詳細については、 ApplicationView.IsFullScreenMode を参照してください。 タブレット モード (Windows 10 のみ) は、サポートされているハードウェア上の Windows 10 の ユーザー オプションであり、ユーザーは任意のアプリをタブレット モードで実行できます。
この例は、「完全なカスタマイズ」セクションで説明したすべてのコードを示しています。
<Page
x:Class="WinUI2_ExtendedTitleBar.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:WinUI2_ExtendedTitleBar"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
muxc:BackdropMaterial.ApplyToRootOrPageBackground="True">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="48"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid x:Name="AppTitleBar" Background="Transparent">
<!-- Width of the padding columns is set in LayoutMetricsChanged handler. -->
<!-- Using padding columns instead of Margin ensures that the background
paints the area under the caption control buttons (for transparent buttons). -->
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="LeftPaddingColumn" Width="0"/>
<ColumnDefinition/>
<ColumnDefinition x:Name="RightPaddingColumn" Width="0"/>
</Grid.ColumnDefinitions>
<Image Source="Assets/WindowIcon.png"
Grid.Column="1"
HorizontalAlignment="Left"
Width="16" Height="16"
Margin="8,0,0,0"/>
<TextBlock x:Name="AppTitleTextBlock"
Text="App title"
Style="{StaticResource CaptionTextBlockStyle}"
Grid.Column="1"
VerticalAlignment="Center"
Margin="28,0,0,0"/>
</Grid>
<!-- This control has a higher z-order than AppTitleBar,
so it receives user input. -->
<AutoSuggestBox QueryIcon="Find"
PlaceholderText="Search"
HorizontalAlignment="Center"
Width="260" Height="32"/>
<muxc:NavigationView Grid.Row="1"
IsBackButtonVisible="Collapsed"
IsSettingsVisible="False">
<StackPanel>
<TextBlock Text="Content"
Style="{ThemeResource TitleTextBlockStyle}"
Margin="12,0,0,0"/>
</StackPanel>
</muxc:NavigationView>
</Grid>
</Page>
public MainPage()
{
this.InitializeComponent();
// Hide default title bar.
CoreApplicationViewTitleBar coreTitleBar =
CoreApplication.GetCurrentView().TitleBar;
coreTitleBar.ExtendViewIntoTitleBar = true;
// Set caption buttons background to transparent.
ApplicationViewTitleBar titleBar =
ApplicationView.GetForCurrentView().TitleBar;
titleBar.ButtonBackgroundColor = Colors.Transparent;
// Set XAML element as a drag region.
Window.Current.SetTitleBar(AppTitleBar);
// Register a handler for when the size of the overlaid caption control changes.
coreTitleBar.LayoutMetricsChanged += CoreTitleBar_LayoutMetricsChanged;
// Register a handler for when the title bar visibility changes.
// For example, when the title bar is invoked in full screen mode.
coreTitleBar.IsVisibleChanged += CoreTitleBar_IsVisibleChanged;
// Register a handler for when the window activation changes.
Window.Current.CoreWindow.Activated += CoreWindow_Activated;
}
private void CoreTitleBar_LayoutMetricsChanged(CoreApplicationViewTitleBar sender, object args)
{
// Get the size of the caption controls and set padding.
LeftPaddingColumn.Width = new GridLength(coreTitleBar.SystemOverlayLeftInset);
RightPaddingColumn.Width = new GridLength(coreTitleBar.SystemOverlayRightInset);
}
private void CoreTitleBar_IsVisibleChanged(CoreApplicationViewTitleBar sender, object args)
{
if (sender.IsVisible)
{
AppTitleBar.Visibility = Visibility.Visible;
}
else
{
AppTitleBar.Visibility = Visibility.Collapsed;
}
}
private void CoreWindow_Activated(CoreWindow sender, WindowActivatedEventArgs args)
{
UISettings settings = new UISettings();
if (args.WindowActivationState == CoreWindowActivationState.Deactivated)
{
AppTitleTextBlock.Foreground =
new SolidColorBrush(settings.UIElementColor(UIElementType.GrayText));
}
else
{
AppTitleTextBlock.Foreground =
new SolidColorBrush(settings.UIElementColor(UIElementType.WindowText));
}
}
トレーニング
モジュール
.NET MAUI XAML ページのレイアウトをカスタマイズする - Training
StackLayout と Grid を使用して、さまざまなデバイス全体で一貫したユーザー インターフェイスを作成します。