XAML:名称空间奇怪的行为Visual Studio

时间:2013-11-07 12:58:40

标签: c# wpf visual-studio xaml xml-namespaces

我的一个当前的WPF项目有问题。用于编译(和运行)的项目就好了。然后,由于许可问题,我们决定从库中删除Extended WPF Toolkit。我曾经使用NumericUpDown s(ShortUpDown,...而不是已弃用的那个)所以我决定自己写一个。

我写了UserControl并对此感到非常满意,但是当我将UpDowns与我的控制权交换时,我称之为MySpinner它已停止工作:

  • 设计师不再显示我的窗口,并显示错误消息:“设计视图无法正确显示,因为尚未构建某些自定义元素。”

  • 我的项目构建了很多错误消息,声明我所有使用的类都不在其命名空间中(除了MySpinner之外的每个类)或(代码中的错误)后面说明我的命名控件(类型MySpinner)在当前上下文中不存在 - 可能是由于XAML没有编译。

我项目中的所有内容都位于名为DeviceSimulator的名称空间中,我已con在我的xmlns:con="clr-namespace:DeviceSimulator"开头使用Window行进行了“<con:完美之前)。

如果我输入Any CPU,IntelliSense甚至会正确地向我提供命名空间中的每个类作为可能的完成。

我知道在看似相似的主题上已经存在很多问题但不同之处在于,在我的情况下,项目不会构建。尽管存在错误,项目构建的问题是我已经运行过几次的问题,但这不是这种情况。

我尝试了在其他问题上提出的解决方案,例如重新启动,重建,清理或将编译目标从x86更改为schemas.microsoft.com...然后返回但没有任何效果(构建和重建不起作用,因为解决方案不会编译)。我正在使用的所有东西都驻留在我的项目文件夹中(当然除了{{1}}的默认命名空间定义),没有额外的库或我包括的,我不在任何类型的网络或服务器上工作。

问题出现在Visual Studio 2013以及2012年,我使用的是Express版本。

4 个答案:

答案 0 :(得分:3)

  

由于用户已经找到了问题的解决方案,这并不是一个答案,而只是一些与此情况相关的信息。

如果您发现自己在之前没有错误的解决方案中遇到了数十个甚至数百个错误,您可以放心,它们主要是“红色鲱鱼”,或者是错误/临时错误。发生这种情况是因为最近发生了某些变化并导致项目中出现一个或几个错误。

通常,其他项目都引用了现在已损坏的项目,因此任何引用已损坏项目中的类的类现在也会显示一个或多个错误......这些错误或更准确的临时错误将会消失当实际错误得到修复并且该项目再次构建时。

当一个类中的错误导致其他类引用破坏的类显示错误,表明某个类显然不存在时,也可能在单个项目应用程序中发生这种情况。这有点像您更改解决方案平台或解决方案配置时,除了在这种情况下,Visual Studio将意识到这些错误本身并不是实际错误。

那么我们如何解决这些问题呢?一般来说,它很容易,因为它通常是编辑的最后一件事,导致实际的错误。即使不是这种情况,您也可以查看Visual Studio中Project的{​​{1}}列,通常出现最多的项目名称是带有错误的项目名称。

此外,您可以忽略许多错误,例如“在项目/命名空间Y中找不到类X”,因为您知道它们确实存在。追踪实际错误是最棘手的部分。

可以帮助多项目应用程序的另一个技巧是使用Error List选项而不是Build > Build XXX (ProjectName)选项来首先构建损坏的项目。您需要先在Build Solution中选择相关项目。有时项目只需要按特定顺序构建,但使用Solution Explorer选项有自己的构建顺序,可能会有所不同。

问题作者最初在设计器中遇到的错误听起来就像他们实际需要做的那样是首先构建包含Build Solution的项目,然后在该项目有dll文件时构建剩余的项目。

我希望这可以帮助其他用户面对数百个错误。

答案 1 :(得分:2)

正如古斯多在评论中所说的那样,通过从项目中移除每一条断线并重建它来解决问题。

所以似乎问题是项目中的某种循环依赖(UserControl&gt; XAML&gt; UserControl),它通过打破依赖关系然后构建一个部分来修复,以便之后可以重新插入依赖项并且项目可以是编译为一个整体。

我发布了这个答案,因为Gusdor似乎没有发布他的答案,我不希望这个问题似乎没有答案。

答案 2 :(得分:1)

为了在XAML Designer中查看XAML代码,页面必须是正确的标记。应该注释掉没有编译的代码隐藏,这样你就可以构建你的项目。

当我们尝试迁移名为&#34; BaseView&#34;的类时,我们的项目中存在类似的问题。以及从旧项目到我们新项目的XAML页面。这些项目有不同的名称空间。我们移动的XAML页面继承了代码隐藏中的BaseView类,而不是Page

  1. 我们做了一个&#34;添加现有项目&#34;在解决方案资源管理器中,然后在新项目的解决方案资源管理器中完成了从旧项目到新项目的类和页面(它带来了代码隐藏文件)的拖放副本在Visual Studio中。 (注意:我们后来发现我们应该在我们的新项目中创建一个新文件夹,而不是将旧项目中包含代码的文件夹拖到新项目中,只需完成旧代码的副本并粘贴它在新文件夹中)(关于我们如何达到这一点的详细信息:https://msdn.microsoft.com/en-us/library/879x19d1(v=vs.90).aspx
  2. 我们更新了using类文件和XAML页面代码隐藏中引用旧命名空间的命名空间和BaseView语句。
  3. 我们更新了XAML页面指令中的命名空间,该指令继承自我们的类文件:<v:BaseView x:Class="OurNamespace.View.PageClassName" ...vmlns:v="clr-namespace:OurNamespace.View"...
  4. 即使在&#34;构建解决方案&#34;之后,我们发现它给了可怕的&#34; 设计视图无法正确显示,因为某些自定义元素尚未构建&# 34;错误。我们在<v:BaseView的{​​{1}}中没有BaseView的鼠标悬停在OurNamespace上时出现错误,即使BaseView的命名空间已正确更新。

    要解决错误,请在将类文件移动到根目录(从XAML页面所在的文件夹中)之后,执行&#34;构建解决方案&#34;,然后将其移回文件夹,再执行另一个操作&#34;构建解决方案&#34;,然后单击名为&#34的按钮; 启用项目代码&#34;它位于XAML Designer的底部,就在水平滚动条的左侧,我们终于认识到了这个类,最终XAML设计师变得生动 - 无论是按钮还是第二个构建,不确定哪个解决了它 - 可能是按钮,如果我不得不把钱放在上面。

    稍后我们发现,如果我们从另一个工作站启动项目,我们仍然遇到问题,如果我们尝试打开XAML页面,它会在“输出”选项卡中显示此错误:

    C:\Users\<User>\AppData\Local\Microsoft\VisualStudio\12.0\Designer\ShadowCache\4olitigs.k2m\hj4ewy5v.g23\MyApplication.dll
    
    Could not load file or assembly 'MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. This assembly was compiled for a different processor.
    

    虽然它在原始工作站上很好,但在第二个工作站上失败了。原来是项目属性的构建标签中的平台目标。它需要设置为&#34;任何CPU&#34; - 至少在我们的情况下 - 避免机器之间的差异。

答案 3 :(得分:0)

仅供将来参考,我的解决方案是我没有在xmlns CLR命名空间定义的末尾添加“; assembly = MyAssembly”。