C#UWP页面无法看到用户控件

时间:2018-07-06 19:58:59

标签: c# visual-studio xaml uwp azure-devops

我相信项目元数据本身已被破坏。我可以制作新页面和新用户控件。我可以在XAML中添加它们,如下所示(为简洁起见,大多数生成的代码都省略了)。 它将编译:

<Page
    x:Class="MyApp.Pages.MyPage"
    …
    xmlns:myControls="using:MyApp.Models">

    <Grid>
        <myControls:MyControl Name="MyControlName"></myControls:MyControl>
    </Grid>
</Page>

在后端:

public sealed partial class MyPage : Page
{
    public MyPage()
    {
        this.InitializeComponent();
    }
}

然后是UserControl:

<UserControl
    x:Class="MyApp.Models.MyControl"
    …>
    <Grid>
    </Grid>
</UserControl>

在后端:

public sealed partial class MyControl : UserControl
{
    public MyControl()
    {
        this.InitializeComponent();
    }
}

一旦我尝试在页面的C#文件中添加对该用户控件的引用,例如:

public sealed partial class MyPage : Page
{
    public MyPage()
    {
        this.InitializeComponent();
        this.MyControlName.Width = 10; // This line breaks it.
    }
}

我收到一个编译器错误,指出“'MyPage'不包含'MyControlName'的定义,没有扩展方法...”

对于我在项目中的任意位置创建的任何任意命名的用户控件,以及在项目中任意位置的我创建的任意命名的页面,都是如此。项目本身似乎不再具有启用页面的CS文件以“查看”放置在页面上的用户控件的能力。但是,其他非用户控件(例如TextBox)仍然可以正常工作。

我知道引用都是正确的,因为当从C#文件中删除那一行时,项目将编译并运行。 XAML一方单独进行编译。另外,请注意,无论我访问控件的什么属性或方法,甚至将控件设置为新值(例如this.MyControlName = new MyControl();),该错误都会持续存在。即使XAML端可以找到该控件的定义,该页面也无法在C#文件中找到该名称的控件的定义。控件的UI甚至可以正确显示在设计视图的页面上。

如果我尝试解决该问题,例如在MyPage.cs文件中显式声明MyControl MyControlName { get; set; },它将生成并运行(即使不应该这样做,因为这是该名称的重复声明) MyPage类的属性)。但是,尝试与应用程序中其他位置的UI进行交互会导致以下错误:

this.<Project>k__BackingField was null

我的研究表明,这通常是与序列化相关的错误。我从来没有明确使用序列化。我想像是在从XAML生成xxx.g.i.cs文件的过程中使用了序列化,所以也许这是项目中有关如何控制生成这些文件的错误?

使用Visual Studio Team Services(VSTS)对实际项目进行版本控制。在此问题发生之前回滚到变更集(已编译并运行良好的变更集)不能解决问题。

我已经竭尽全力在另一台PC上使用Visual Studio,映射了该项目(以前从未在该PC上使用过),并在出现问题之前获取了以前的版本。问题仍然存在。

似乎项目本身和/或其元数据或生成的文件可能已因某种原因被损坏,删除或损坏。不知何故,这种破坏似乎现在可以扩展到VSTS中的变更集,该变更集在此问题发生之前已经签入并且可以正常使用。

最后要注意的一点是,当我在Visual Studio中打开项目时,我的PC崩溃了(因为需要硬重置),并且项目中的某些文件(.cs和.xaml)都打开了当时。我可以看到这可能会损坏文件,但是看不到它似乎是如何在崩溃之前追溯损坏了功能齐全的变更集。

该项目包括几个月的开发以及关于VSTS的广泛历史。它是完全不可用的(因为应用程序的核心功能都依赖于用户控件)。我能想到的唯一解决方案是在解决方案中创建另一个项目,然后将文件中的代码复制并粘贴到该项目中的新文件中。但是,我仍然希望在可能的情况下修复现有项目,以使数百个以前的变更集仍然可用。任何关于如何解决此问题的想法(甚至从哪里开始寻找问题)都将不胜感激!

0 个答案:

没有答案