为什么Visual Studio找不到我的WPF InitializeComponent方法?

50

这很奇怪。

我有一个XAML文件,看起来如下...

<Window
    x:Name="window"
    x:Class="ix.Production.Title"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Title" Height="768" Width="1024"
    Loaded="window_Loaded">

    <Window.Resources>
   etc...

我的代码如下所示...

using System;
using System.Windows;
using System.Windows.Media.Animation;
using System.Threading;

namespace ix.Production
{
    public partial class Title : Window
    {
        public Title()
        {
           InitializeComponent();
        }
    ....

这段代码无法编译,因为Visual Studio坚持认为InitializeComponent"在当前上下文中不存在。"
我该如何解决这个问题?

啊,我这边犯了个傻瓜式的拼写错误(我有两个类似的项目)。类的命名空间实际上是正确的,但我仍然得到相同的错误。 - willem
15个回答

55

有一个情况是当你复制和粘贴XAML控件/窗口等时,会出现这种情况。

InitializeComponent方法存在于对应的.g.cs文件中,该文件是自动生成的。在我的情况下,在复制和粘贴后,XAML(在属性窗口中)的生成操作(Build Action)被更改为"Resource"。我将它更改为"Page",然后开始正常工作了。

希望这可以帮助到您。

帮助我的线程是'InitializeComponent'不存在的名称...


3
复制和粘贴时我经常遇到这个问题,知道要检查这个问题很不错。 - cab
1
是的,当在项目之间复制XAML文件时,我也遇到了这个问题。 - Dinis Cruz
4
在剪切和粘贴操作后,我的+1变成了CodeAnalysisDictionary,微软好样的!将其设置回Page后问题解决了。非常感谢gp。 - Sheridan
8
复制/粘贴代码时,要注意确保命名空间和类与后台代码相符。这就是我曾经犯过的错误。 - mungflesh
5
在我的情况下,将构建更改为其他内容,然后再更改回“页面”可以解决问题(已标记为“页面”)。 - dba
显示剩余3条评论

37

您的 XAML 代码如下:

x:Class="ix.Production.Title"

实际类名为 ix.Outage.Title。请更改XAML声明或将该类移至 ix.Production 命名空间。


18
如此简单,但很容易被忽视:`MainWindow` 的 `x:Class` 被设置为“`MainWindow`”,而应该设置为 `namespace.MainWindow` (`x:Class="namespace.MainWindow"`)。如果不这样做,那么 `MainWindow.g.xaml` 文件将不包括命名空间块,并且在 `MainWindow` 构造函数中调用 `InitializeComponent()` 将无法工作。
虽然这显然不能解决 willem 的问题,但我在这里发布它是因为有很多其他的解决方案。希望这能帮助其他遇到此问题的人。

9

您的命名空间不匹配:

x:Class="ix.Production.Title"
namespace ix.Outage { ...

为了检查正确的命名空间,您可以转到“项目”->“属性”->“AssemplyInfo.cs”,并在“XmlnsDefinition”中查找命名空间名称。如果您忘记添加“XmlnsDefinition”,那么这可能是一个不错的主意。 - Arsen Khachaturyan

2

当我重命名自定义控件类或更改类的名称空间时,通常会遇到这个问题。如果您不使用Visual Studio的重构,则必须手动更改XAML和C#文件中的名称。

重构仅适用于仅重命名类的情况,对于命名空间重命名,您必须手动执行。

要查找InitializeComponent,请查看[项目文件夹]\obj\Debug\<class_name.g.cs>


2
或者直接删除\obj文件,让Visual Studio重新构建它。 - JordanBean
抱歉,我本打算提供一个完整的答案 :) - Andrei Floroiu

1
当我将包含我的数据类的PCL添加到解决方案中后,我就无法从代码后台找到InitializeComponent和其他与XAML相关的UI部分。但是如果我删除PCL,则可以再次找到它们。无论是否找到,我仍然可以编译。只是在输入代码时无法自动完成。也许你的解决方案中有一个PCL项目?(我还不知道如何解决这个问题)

1

我曾经遇到过一个问题,就是将一个Visual Studio 2010示例项目手动还原为Visual Studio 2008时。我发现我忘记了将该项目的目标框架设置为.NET Framework 3.5。在还原为Visual Studio 2008的项目中,它是空的,而在最初设置为4.0的原始Visual Studio 2010项目中,则是设置为4.0。

要设置项目的目标框架,请转到项目属性,访问名为“应用程序”的第一个选项卡,并在目标框架下拉菜单中选择.NET Framework 3.5。

当然,我更希望Visual Studio能够给我一个错误提示或者至少警告我没有设置目标框架,但是嘿,我想这就是在Visual Studio中开发的一部分吧。

Visual Studio 2008 WPF project properties


1

看起来这是Visual Studio 2008中的一个小问题。

如果我创建一个新文件(即Title2),复制/粘贴代码和XAML,然后将所有“Title”更改为“Title2”,那么一切都能正常工作。


0
这种情况发生在我身上,因为Visual Studio在将XAML文件从一个项目复制/粘贴或移动到另一个项目时会将“构建操作”设置为某个随机的操作
解决方案:确保你的XAML的“构建操作”设置为页面。
希望这能对你有所帮助。

0

顺便说一下,今天我在将Visual Studio 2008解决方案迁移到Visual Studio 2010后遇到了同样的问题。看起来迁移出了问题,项目丢失了它们的目标框架(在项目属性中):现在该设置为空!?

设置.NET Framework 3.5解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接