为什么添加ContentControl会导致我的应用程序进入中断模式?

时间:2017-12-14 23:35:58

标签: c# wpf xaml contentcontrol window-chrome

我已经创建了一个漂亮的WindowChrome样式来应用于我的窗户。但是,当我将ContentControl添加到我的样式时,应用程序将进入中断模式。

我已将来自this youtube videothis articlethis SO questionMicrosoft's documentation的代码拼凑在一起,并且我已经提出以下代码。

注意:以下代码都被认为是相关,因为应用程序无法使用这两个部分运行(是的,我知道它可以在没有代码隐藏的情况下运行,但是令人讨厌的是必须从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.xaml 通过ContentControlTemplate 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行),收到以下消息。当删除/注释掉同一行时,应用程序无需进入中断模式即可运行。

Message: The application is in break mode

查看“输出”窗口我收到以下消息:

An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll
Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.

问题

此代码直接放在Window的XAML代码中时有效,但是当我尝试将其放入模板时,它失败了。

我的问题是:

  1. 为什么我的应用程序在ContentControl的模板中放置Window时会进入中断模式
  2. 如何解决此问题?
    • 请注意,我必须使用ControlTemplate文件中的Icons.xaml,并且对此内容的调用必须保留在Style窗口中(而不是窗口&# 39; s实际的xaml)。

1 个答案:

答案 0 :(得分:1)

问题是由于the answerthis question的格式不正确。我将我的问题标记为该问题的副本,但我觉得我应该将其作为答案分享,以防其他人帮助。

我喜欢微软并没有以适当的例外处理这个问题,你需要将头撞到墙上,直到你的头部或墙壁断裂。

代码

我的App.xamlResourceDictionary.MergedDictionaries

中包含以下代码
<ResourceDictionary Source="pack://application:,,,/MyProject;component/Window.xaml"/>
<ResourceDictionary Source="pack://application:,,,/MyProject;component/Icons.xaml"/>

我将订单更改为以下

<ResourceDictionary Source="pack://application:,,,/MyProject;component/Icons.xaml"/>
<ResourceDictionary Source="pack://application:,,,/MyProject;component/Window.xaml"/>