5

簡単に

WindowChromeウィンドウに適用する美しいスタイルを作成しました。しかし、自分のスタイルに追加ContentControlすると、アプリケーションは中断モードに入ります。

この youtube videothis articlethis 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機能しましたが、テンプレートに配置しようとすると失敗します。

私の質問は次のとおりです。

  1. をテンプレートに配置すると、アプリケーションが中断モードになるのはなぜですか?ContentControlWindow
  2. この問題を解決するにはどうすればよいですか?
    • ControlTemplateファイルからmy を使用するIcons.xaml必要があり、このコンテンツへの呼び出しはウィンドウStyle(ウィンドウの実際の xaml ではなく) に残す必要があることに注意してください。
4

1 に答える 1