C# 如果自定义窗口类显式指定内容应该放在哪里,那么阻止创建自定义窗口类的原因是什么?

C# 如果自定义窗口类显式指定内容应该放在哪里,那么阻止创建自定义窗口类的原因是什么?,c#,.net,wpf,xaml,inheritance,C#,.net,Wpf,Xaml,Inheritance,因此,我们的目标是在XAML中创建一个新的自定义窗口(其中包含一些东西),我可以在另一个XAML设计器中使用它作为根节点(解决方法是这样做的)。这曾经使它成为可能(还有一个仍然存在的错误说法),但是已经更改,现在会出现错误:“xyz不能是XAML文件的根,因为它是使用XAML定义的” 微软简洁地说: 您需要在不使用XAML的情况下在代码中定义基类 其他人进一步解释说,这是因为XAML设计器不知道在自定义窗口中放置内容的位置;这是合理的,因为在它的内容控制中已经有东西了 所以,这让我思考 如果我在

因此,我们的目标是在XAML中创建一个新的自定义窗口(其中包含一些东西),我可以在另一个XAML设计器中使用它作为根节点(解决方法是这样做的)。这曾经使它成为可能(还有一个仍然存在的错误说法),但是已经更改,现在会出现错误:“xyz不能是XAML文件的根,因为它是使用XAML定义的”

微软简洁地说:

您需要在不使用XAML的情况下在代码中定义基类

其他人进一步解释说,这是因为XAML设计器不知道在自定义窗口中放置内容的位置;这是合理的,因为在它的内容控制中已经有东西了

所以,这让我思考

如果我在xaml中创建自定义MyWindow,如下所示:

<Window x:Class="MyStuff.MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MyWindow">
    <Grid>
        <UserControl Name="ContentContainer"/>
        <!-- some undefined content here to justify this exercise -->
    </Grid>
</Window>
…为什么我仍然被禁止这样做? 在这种情况下,为什么默认编译器行为不要求显式覆盖内容以指向另一个合适的位置


在没有明确定义内容应该放在哪里的实现中,为什么不使用默认功能将父控件中ContentControl中的任何内容替换为带有警告的内容(并且仅在父窗口的ContentControl不可访问时抛出错误)?

我想你是在混淆内容的本质

窗口的
内容
是窗口元素中的所有内容,这包括您的
用户控件

你有几个选择

  • 为附加内容创建依赖项属性,并将
    ContentControl
    ContentPresenter
    绑定到此属性。看
  • 为您的
    窗口创建
    样式
    ,您可以使用
    控制模板
    定义
    窗口的
    内容
    。看
  • 1和2的组合,这将是一个自定义控件,这里您将从
    窗口
    继承,并定义其样式和控件模板。看

  • 为什么不为
    窗口
    类定义一个新的ControlTemplate呢?只要在ContentPresenter周围添加控件,就可以了。。。一个可重复使用的XAML,适用于您想要的所有窗口。为什么不呢?这是问题第二行链接中的第二个建议解决方案,很可能是我将采用的解决方案。不过,谢谢你的评论,我希望我们能在将来为其他人节省一点时间。我明白了,我没有检查这个链接:P在我看来,修改模板应该是这类事情的第一选择,即使你试图做的事情实际上得到了支持。WPF中的控件应该是无外观的,它们的可视表示形式仅来自样式和模板。窗口是一个控件,扩展它并试图在代码中定义固定的外观违背了WPF原则。正确的方法是通过模板;ControlTemplate,在这种情况下,因为您试图修改的不是窗口的内容模板,而是窗口的外观本身。是的,我知道。我只是希望您能够以与其他元素相同的方式隐藏元素的内容属性(通过创建getter和setter,从而扩展功能)。谢谢你的建议。它们是有用的,将帮助那些陷入这个问题的人,尽管我仍然很好奇为什么这是微软选择的功能,而我可以想象这样做似乎更合理,而不是一个顽固的构建错误。
    using System.Windows;
    
    namespace MyStuff
    {
        public partial class MyWindow : System.Windows.Window 
        {
            // hide our window content with new keyword
            public new object Content 
            {
                get { return ContentContainer.Content; }
                set { ContentContainer.Content = value; }
            }
    
            public Window()
            {
                InitializeComponent();
            }
        }
    }