Ответ 1
Согласно 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>
Обратите внимание, что в качестве корневого элемента есть Grid, который содержит несколько элементов для настройки NC окна.
UPDATE:
Вы можете заметить в примечании на странице MSDN, он содержит разделы:
WindowStyle.None
WindowChrome
Это два способа настройки внешнего вида окна приложения WPF.
Однако, задав для свойства Window.WindowStyle
значение WindowStyle.None
:
Это удаляет рамку неклиента из окна и оставляет только клиентской области, к которой вы можете применить собственный стиль. Однако, когда кадр без клиента удаляется, вы также теряете системные функции и которые он предоставляет, например, кнопки заголовка и окна изменение размера. Другим побочным эффектом является то, что окно будет охватывать Панель задач Windows, когда она максимизирована.
Затем вводится WindowChrome
, чтобы включить настройку NC с помощью WPF:
Чтобы настроить окно, сохраняя стандартную функциональность, вы может использовать класс WindowChrome. Класс WindowChrome отделяет функциональность оконной рамы из визуальных элементов и позволяет контролировать границу между клиентскими и неклиентскими областями вашего окно приложения. Класс WindowChrome позволяет помещать содержимое WPF в оконной рамы путем расширения клиентской области для покрытия неклиента площадь. В то же время он сохраняет системное поведение через два невидимые области; области изменения размера и заголовка.
Итак, вернемся к вашему вопросу, шаблон, который вы нашли, должен быть скопирован из примера кода MSDN, но пропустил истинный корень Grid
.
Маржа на границе предназначена для предоставления некоторого пространства для ЧПУ.
В образце кода MSDN ContenPreseter
содержит только область клиента, а NC содержит Border
, a TextBlock
для заголовка окна и значок Image
для окна.
Чтобы указать, установка WindowChrome
позволяет настроить область ЧПУ окна в 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>