簡単に
WindowChrome
ウィンドウに適用する美しいスタイルを作成しました。しかし、自分のスタイルに追加ContentControl
すると、アプリケーションは中断モードに入ります。
この youtube video、this article、this SO question、およびMicrosoft のドキュメントからコードをつなぎ合わせて、次のコードを作成しました。
注:アプリケーションはこれらの部分のいずれかで実行できないため、以下のコードはすべて関連していると見なされます(コードビハインドなしで実行できることはわかっていますが、閉じるボタンの代わりにVisual Studioからアプリケーションを停止する必要があるのは面倒です-これ私が達成しようとしているものでもあります)。作業しやすいように、実際には以下のコードをスリム化しました。
コード
Window.xaml
<Style x:Key="TestWindow" TargetType="{x:Type Window}">
<Setter Property="Background" Value="#FF222222"/>
<Setter Property="BorderBrush" Value="WhiteSmoke"/>
<Setter Property="BorderThickness" Value="5,30,5,5"/>
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome CaptionHeight="20"
CornerRadius="0"
GlassFrameThickness="0,0,0,-1"
NonClientFrameEdges="None"
ResizeBorderThickness="5"
UseAeroCaptionButtons="True"/>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<Grid>
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<AdornerDecorator>
<ContentPresenter/>
</AdornerDecorator>
</Border>
<DockPanel LastChildFill="True" VerticalAlignment="Top" Height="30">
<StackPanel DockPanel.Dock="Right"
Orientation="Horizontal"
VerticalAlignment="Center">
<Button x:Name="Button_Close"
WindowChrome.IsHitTestVisibleInChrome="True"
Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"
Click="CloseClick">
<ContentControl Template="{StaticResource Icon_Close}" Height="10"/>
</Button>
</StackPanel>
<StackPanel DockPanel.Dock="Left"
Orientation="Horizontal"
VerticalAlignment="Center">
<Image x:Name="PART_WindowCaptionIcon"
Width="16"
Height="16"
Margin="0,0,6,0"
Source="{TemplateBinding Icon}"/>
<TextBlock x:Name="PART_WindowCaptionText"
Margin="6,0,0,0"
Padding="0">
<Run BaselineAlignment="Center"
Text="{TemplateBinding Title}"
Foreground="Black"/>
</TextBlock>
</StackPanel>
</DockPanel>
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="PART_WindowCaptionIcon" Property="Source" Value="{x:Null}">
<Setter TargetName="PART_WindowCaptionIcon" Property="Visibility" Value="Collapsed"/>
<Setter TargetName="PART_WindowCaptionText" Property="Margin" Value="5,0,0,0"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Icons.xaml
Window.xamlContentControl
Template
は、を介して属性値のこのファイルを参照しますApp.xaml
。
<ControlTemplate x:Key="Icon_Close">
<Viewbox>
<Polygon Points="357,35.7 321.3,0 178.5,142.8 35.7,0 0,35.7 142.8,178.5 0,321.3 35.7,357 178.5,214.2 321.3,357 357,321.3 214.2,178.5" Fill="Black"/>
</Viewbox>
</ControlTemplate>
Window.xaml.cs
public partial class Window : ResourceDictionary
{
public Window()
{
InitializeComponent();
}
private void CloseClick(object sender, RoutedEventArgs e)
{
var window = (System.Windows.Window)((FrameworkElement)sender).TemplatedParent;
window.Close();
}
}
問題
行<ContentControl Template="{StaticResource Icon_Close}" Height="10"/>
が存在する場合 (行 38)、次のメッセージが受信されます。同じ行が削除/コメントアウトされると、アプリケーションは中断モードに入らずに実行されます。
出力ウィンドウを見ると、次のメッセージが表示されます。
An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll
Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.
質問
このコードは、の XAML コードに直接配置するとWindow
機能しましたが、テンプレートに配置しようとすると失敗します。
私の質問は次のとおりです。
- をテンプレートに配置すると、アプリケーションが中断モードになるのはなぜですか?
ContentControl
Window
- この問題を解決するにはどうすればよいですか?
ControlTemplate
ファイルからmy を使用するIcons.xaml
必要があり、このコンテンツへの呼び出しはウィンドウStyle
(ウィンドウの実際の xaml ではなく) に残す必要があることに注意してください。