根據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的元素。
UPDATE:
您可以在MSDN頁面的備註注意到,它包含幾個部分:
WindowStyle.None
WindowChrome
這些自定義外觀的兩種方式的WPF應用程序窗口。
然而,Window.WindowStyle
屬性設置爲WindowStyle.None
:
這消除了從窗口非客戶端框架,只保留了 客戶區,您可以將自定義樣式。但是,如果刪除了非客戶端幀,則還會丟失其提供的系統功能和 行爲,例如字幕按鈕和窗口大小調整。另一個副作用是該窗口將在最大化時覆蓋Windows任務欄的 。
然後WindowChrome
介紹了使用WPF,使NC定製:
要自定義窗口,同時保留其標準功能,您 可以使用WindowChrome類。 WindowChrome類將窗口框架的 功能與視覺效果分開,並讓您控制 應用程序窗口的客戶端和非客戶端區域之間的邊界。 WindowChrome類允許您通過擴展客戶區來覆蓋非客戶端 區域,將WPF內容放置在窗口框架的 中。同時,它通過兩個不可見的區域保留系統行爲;調整邊框和標題區域。
所以回到你的問題,你找到了模板,應該從MSDN示例代碼複製,但錯過了真正的根Grid
。 邊界上的邊緣是爲了給NC提供一些空間。 在MSDN示例代碼中,ContenPreseter
僅包含客戶端區域,而NC包含窗口圖標的Border
,TextBlock
和窗口圖標的Image
。
回顧一下,設置WindowChrome
使您可以在Window.Template
中自定義窗口的NC區域。
注: 樣本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>
你是對的我相信。他們從MSDN複製了代碼,並以某種方式保持這種狀態。 – hattenn