MSDN によると、WindowChromeは
ウィンドウの非クライアント領域に対するカスタマイズを記述するオブジェクトを表します。
MSDN サンプルを読み、コードをしばらく再生した後、コードが MSDN サンプル コードの次のようになっていることに気付きました。
<Style x:Key="StandardStyle" TargetType="{x:Type local:MainWindow}">
<Setter Property="shell:WindowChrome.WindowChrome">
<Setter.Value>
<shell:WindowChrome />
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MainWindow}">
<!--Note there is a Grid as the root-->
<Grid>
<Border Background="White"
Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}">
<ContentPresenter Content="{TemplateBinding Content}" />
</Border>
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="36,8,0,0"/>
<Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness}"
Width="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=SmallIconSize.Width}"
shell:WindowChrome.IsHitTestVisibleInChrome="True"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
ウィンドウの NC をカスタマイズするためのいくつかの要素を含むルート要素として Grid があることに注意してください。
アップデート:
MSDN ページのコメントで気付くかもしれませんが、セクションが含まれています。
WindowStyle.None
WindowChrome
これらは、WPF アプリケーション ウィンドウの外観をカスタマイズする 2 つの方法です。
ただし、Window.WindowStyle
プロパティをWindowStyle.None
次のように設定します。
これにより、非クライアント フレームがウィンドウから削除され、カスタム スタイルを適用できるクライアント領域のみが残ります。ただし、非クライアント フレームが削除されると、キャプション ボタンやウィンドウのサイズ変更など、非クライアント フレームが提供するシステム機能と動作も失われます。もう 1 つの副作用は、ウィンドウを最大化すると、ウィンドウが Windows タスクバーを覆うことです。
次にWindowChrome
、WPF を使用して NC のカスタマイズを有効にする方法を紹介します。
標準機能を維持しながらウィンドウをカスタマイズするには、WindowChrome クラスを使用できます。WindowChrome クラスは、ウィンドウ フレームの機能をビジュアルから分離し、アプリケーション ウィンドウのクライアント領域と非クライアント領域の間の境界を制御できるようにします。WindowChrome クラスを使用すると、クライアント領域を拡張して非クライアント領域をカバーすることにより、ウィンドウ フレームに WPF コンテンツを配置できます。同時に、2 つの目に見えない領域を通じてシステムの動作を保持します。リサイズ枠とキャプション領域。
質問に戻りますが、見つかったテンプレートは MSDN サンプル コードからコピーする必要がありますが、真の root がありませんGrid
でした。ボーダーのマージンは、NC にいくらかのスペースを与えるためのものです。MSDN サンプル コードでは、ContenPreseter
にはクライアント領域のみが含まれ、NC にはBorder
、TextBlock
ウィンドウ タイトル、およびImage
ウィンドウ アイコンが含まれています。
要約すると、 設定WindowChrome
により、 のウィンドウの NC 領域をカスタマイズできますWindow.Template
。
注:
サンプルの MSDN サンプル コードは、.Net 4.5 では少し古くなっSystem.Windows.Shell.WindowChrome
ているPresentationFramework.dll
ようです。
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Style="{DynamicResource WindowStyle1}" Icon="Icon1.ico">
<Window.Resources>
<Style x:Key="WindowStyle1" TargetType="{x:Type Window}">
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome />
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<Grid>
<Border Background="Red"
Margin="{Binding Source={x:Static SystemParameters.WindowNonClientFrameThickness}}">
<ContentPresenter Content="{TemplateBinding Content}" />
</Border>
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="36,8,0,0"/>
<Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=WindowChrome.WindowChrome.ResizeBorderThickness}"
Width="{Binding Source={x:Static SystemParameters.SmallIconWidth}}"
WindowChrome.IsHitTestVisibleInChrome="True"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Button />
</Grid>