【问题标题】:MyUserControl cannot be the root of a XAML file because it was defined using XAML [duplicate]MyUserControl 不能是 XAML 文件的根,因为它是使用 XAML 定义的 [重复]
【发布时间】:2012-06-03 18:55:47
【问题描述】:

可能重复:
Inheriting from a UserControl in WPF

我正在尝试创建一个 WPF 用户控件,该控件派生自另一个我也已定义的用户控件。

<myNamespace:NavigationControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:myNamespace="clr-namespace:myNamespace" mc:Ignorable="d"
x:Class="myNamespace.WelcomeScreen"
x:Name="UserControl"
d:DesignWidth="640" d:DesignHeight="480">

WelcomeScreen.cs 如下所示:

public partial class WelcomeScreen : NavigationControl
{
    public WelcomeScreen()
    {
        this.InitializeComponent();
    }
}

当我编译这个时,我得到以下错误:

'myNamespace.NavigationControl' 不能是 XAML 文件的根,因为它是使用 XAML 定义的。

我做错了什么?

【问题讨论】:

  • 对于带有视觉继承的 WPF 解决方法,请参阅:svetoslavsavov.blogspot.gr/2009/09/… 或对于在祖先中显式定义 GUI,请参阅 support.microsoft.com/kb/957231
  • 我不认为这是完全重复的......另一个问题根本没有提到这个错误消息。它们当然是相关的,但这个更具体。另一个,事实上,我认为甚至不清楚被问到什么。

标签: c# wpf xaml


【解决方案1】:

请参阅 MS 知识库文章:http://support.microsoft.com/kb/957231。不支持在 XAML 中派生用户控件;您必须在代码中派生用户控件。

【讨论】:

    【解决方案2】:

    你不应该这样做,错误告诉你。

    此外,使用 XAML 您设置了Content,如果您在派生控件中再次设置它,您将丢失之前定义的所有内容。如果您想要继承和可重用性,请使用自定义控件(并创建相应的ControlTemplate)。

    【讨论】:

    • 这很糟糕。在 UWP、Silverlight 和 Xamarin Forms 中,这是完全正常的。似乎 WPF 缺少执行此操作的能力。
    • 这里的答案有一个很大的假设。假设是,如果您在使用 XAML 根目录中的基类时尝试设置内容。情况不一定如此。
    • “错误告诉你”。 -- 你在看东西。
    • 澄清一下:只要基类没有关联的 xaml 文件,您就可以像这样使用 UserControl 或 Window 进行继承。如果您只想要一个提供通用帮助函数/属性的基本 Window/UserControl 类,请将其创建为常规类(而不是 UserControl/Window),然后使用代码添加基类,而不是使用 New-&gt;UserControl 菜单.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多