代码之家  ›  专栏  ›  技术社区  ›  ctwheels

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

  •  5
  • ctwheels  · 技术社区  · 7 年前

    简明的

    我创造了一个美丽的 WindowChrome 应用于我的窗口的样式。当我添加时 ContentControl 然而,按照我的风格,应用程序进入中断模式。

    我从中拼凑出代码 this youtube video , this article , this SO question Microsoft's documentation 我提出了以下代码。

    笔记 :以下代码已全部考虑在内 相关的 由于应用程序无法使用这两个部分中的任何一个运行(是的,我知道它可以在没有代码的情况下运行,但必须从Visual Studio停止应用程序,而不是关闭按钮,这也是我试图完成的任务,这很烦人)。实际上,我已经精简了下面的代码,以便更容易使用。


    密码

    窗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>
    

    图标。xaml

    窗xaml 引用此文件以获取 内容控制 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>
    

    窗xaml。反恐精英

    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 ,但当我尝试将其放置在模板中时,它失败了。

    我的问题是:

    1. 为什么我的申请进入 中断模式 什么时候 内容控制 放置在 的模板?
    2. 我如何解决这个问题?
      • 请注意,我必须使用 ControlTemplate Icons.xaml 并且对该内容的调用必须保留在窗口的 Style (而不是窗口的实际xaml)。
    1 回复  |  直到 7 年前
        1
  •  1
  •   ctwheels    7 年前

    简明的

    问题是由于我的风格顺序不正确 the answer 在…上 this question . 我将我的问题标记为该问题的副本,但我觉得我应该将此作为答案分享,以防它对其他人有所帮助。

    我喜欢微软没有适当的例外来处理这个问题,你需要把头撞到墙上,直到你的头或墙破裂。

    密码

    我的 App.xaml 包含以下代码 ResourceDictionary.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"/>