我相信项目元数据本身已被破坏。我可以制作新页面和新用户控件。我可以在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的广泛历史。它是完全不可用的(因为应用程序的核心功能都依赖于用户控件)。我能想到的唯一解决方案是在解决方案中创建另一个项目,然后将文件中的代码复制并粘贴到该项目中的新文件中。但是,我仍然希望在可能的情况下修复现有项目,以使数百个以前的变更集仍然可用。任何关于如何解决此问题的想法(甚至从哪里开始寻找问题)都将不胜感激!