【问题标题】:"Kproj.Forms.frmSwitch" cannot be the root of a XAML file because it was defined using XAML“Kproj.Forms.frmSwitch”不能是 XAML 文件的根,因为它是使用 XAML 定义的
【发布时间】:2016-08-25 22:33:47
【问题描述】:

我知道发布的其他问题似乎是相同的问题,但没有一个能解决我的问题。

我是 WPF 新手,我正在尝试将程序从 WinForms 转换为 WPF。我有一个主窗口“Kproj.Forms.frmLogin”,它继承了一个基类“Kproj.Forms.frmSwitch”,它继承了 System.Windows.Window 类。当我遇到上述问题时,我最初的 XAML 代码是:

<Control:frmSwitch x:Class="Kproj.Forms.frmLogin"
    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:Control="clr-namespace:Kproj.Forms"
    mc:Ignorable="d"
    Title="LOG IN" Height="309" Width="678">
    <Grid Height="271" Width="662">
        ... Content
    </Grid>
</Control:frmSwitch>

在代码隐藏中包含这些:

namespace Kproj.Forms
    {
        public partial class frmLogin : frmSwitch
        {
        }
    }

namespace Kproj.Forms
    {
        public partial class frmSwitch : Window
        {
        }
    }

经过进一步研究,我发现我需要将 frmSwitch 制作成一个没有 XAML 的基类。因此,我以普通的 Class 形式创建了 frmSwitch2,如下所示:

namespace Kproj.Forms
{
    public class frmSwitch2 : Window
    {
    }
}

然后我相应地调整了主窗口 XAML:

<Control:frmSwitch2 x:Class="Kproj.Forms.frmLogin"
    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:Control="clr-namespace:Kproj.Forms"
    mc:Ignorable="d"
    Title="LOG IN" Height="309" Width="678">
    <Grid Height="271" Width="662">
        ... Content
    </Grid>
</Control:frmSwitch2>

和主窗口代码隐藏到:

namespace Kproj.Forms
    {
        public partial class frmLogin : frmSwitch
        {
        }
    }

现在,我丢失了原始错误消息,但我得到了一条消息,指出

"The name 'frmSwitch2' does not exist in the namespace 'clr-namespace:FITS.Forms'."

即使当我在主窗口 XAML 中键入“Control:”时它会提示“frmSwitch2”,所以它知道它确实存在于命名空间中。有什么建议吗?

免责声明:我尝试尽可能地对其进行研究,但我在 StackOverflow 上发现的所有帖子都是这个问题,但通过从 XAML\cs 部分类转换为单独的代码隐藏完整 XAML-低级。

【问题讨论】:

  • 在 WPF 中,通常主窗口只是一个外壳,它只包含其他用户如何控制的网格区域。从重新安排您的主窗口开始,以包含网格行和列,因为您想要布置的东西。然后创建其他控件,因为您希望它们彼此分开,例如UCTitle 用于标题,UCNav 用于导航,UCStatus 用于状态栏,UCMain 用于主窗口中的主要区域。然后使用包含而不是继承..如果你真的需要继承那么你真的需要学习 MVVM

标签: c# wpf winforms xaml wpf-controls


【解决方案1】:

在研究了继承真正想要什么之后,我了解到继承的唯一目的是用于变量,因此我能够使其工作,但只需将它们转换为静态全局变量并直接访问它们。毕竟我最终不需要继承。

如果其他人最终知道更多 MVVM,确实遇到了解决此问题的方法,那么很高兴知道它。即使我不再需要它,这将是一个很好的学习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多