如何复制粘贴WPF窗口(克隆)并没有错误

时间:2014-12-29 22:09:33

标签: c# wpf

我正在使用带有WPF和C#5.0的.Net 4.5.2。我在WPF项目中创建了一个Window。我想在解决方案资源管理器中复制粘贴此窗口,创建第二个窗口,并将其重命名为新名称。

当我这样做时,新的(复制的)窗口的InitializeComponent()方法总是给我一个错误。如何在解决方案资源管理器中干净地复制窗口(及其代码等)?

这个问题部分得到了解答:Copy pasting WPF window gives error但答案并没有解决我的问题。

我的方法(不起作用):

  1. 创建一个窗口并将其命名为WindowTest
  2. 在解决方案资源管理器中,选择WindowTest并复制,然后将其粘贴到同一项目中
  3. 将新复制的窗口重命名为WindowTestCopy
  4. 在WindowTestCopy中,将xaml中的x:class属性更改为WindowTestCopy而不是WindowTest
  5. 在WindowTestCopy中打开后面的代码,并将对WindowTest的任何引用更改为WindowTestCopy
  6. 编译
  7. 预期:没有错误,复制(克隆)操作成功

    实际:编译错误"无法访问非静态方法' InitializeComponent'在静态环境中#34;

    我只有这一个错误。显然,InitializeComponent()正在成为一个模棱两可的参考,但我不清楚如何对代码进行手动编辑来解决这个问题。我希望VS或Resharper会自动帮我解决这个问题。

    更新

    WindowTest包含两个我之前未提及的userControl。发生复制/粘贴后,由于某种原因,以下xaml元素在WindowTestCopy中变得格式不正确:

    的xmlns:用户控件....(ellided) 的xmlns:用户控件....(ellided)

    通过删除这些,Resharper确定userControl对象缺少xmlns引用标记,并询问我是否要自动导入它们。我选择了是的。在Resharper添加了缺少的xmlns引用标记后,我能够编译(所有错误都消失了)。

    我没有解释为什么会这样。在我重现的步骤中,我不编辑xaml,因此它应该与原始xaml相同。这是一种奇怪的行为,但至少有一种解决方法如上所述。

3 个答案:

答案 0 :(得分:2)

其他人实际发布然后删除了正确的想法,但简要说明原因。

您遇到的问题是由于同一项目中的类重复...即使在解决方案资源管理器中,您也可以轻松复制/粘贴WPF表单或任何其他类,用户控件类等。复制时,它将文件名后缀为" - 复制",如果你立即编译将失败。原因是什么?在类本身中,类名和窗口名是相同的。因此,在项目中,您有两个类的实例,并且它正在窒息,希望您解决重复项。我在WPF开发的早期遇到了同样的事情。

所以,既然我已经解释了为什么它失败了,那么你需要做的就是纠正这个问题。我在我的示例项目中创建了一个名为" FirstWindowSample"的窗口,因此创建了两个文件FirstWindowSample.xaml和FirstWindowSample.xaml.cs。 .cs版本是窗口的代码隐藏(或用户控件类,原理完全相同。

如果您查看" FirstWindowSample.xaml"代码(视觉设计版本),代码看起来像......

<Window x:Class="YourProject.FirstWindowSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="FirstWindowSample" Height="300" Width="300">
    <Grid>

    </Grid>
</Window>

请注意第一行

   x:Class="YourProject.FirstWindowSample"

您需要更改&#34; .FirstWindowSample&#34;为你的新表格提供任何你想要的东西,比如

   x:Class="YourProject.SecondWindowSample"

接下来,切换到CODE-BEHIND文件&#34; FirstWindowSample.xaml.cs&#34;。

namespace YourProject
{
    /// <summary>
    /// Interaction logic for FirstWindowSample.xaml
    /// </summary>
    public partial class FirstWindowSample : Window
    {
        public FirstWindowSample()
        {
            InitializeComponent();
        }
    }
}

这是类名及其相应构造函数的硬引用。只需更改这些以匹配您期望的新窗口名称(例如示例SecondWindowSample)

namespace YourProject
{
    /// <summary>
    /// Interaction logic for SecondWindowSample.xaml
    /// </summary>
    public partial class SecondWindowSample : Window
    {
        public SecondWindowSample()
        {
            InitializeComponent();
        }
    }
}

最后,您的项目现在将具有完全不同的类名,该类名不会重复并导致编译错误。你第一次遇到这个问题,是的......很难找到答案。一旦你得到它,接下来的2-3次是&#34; oh-yeah&#34;复习......在那之后你就不用考虑它了。

答案 1 :(得分:2)

当它发生在我身上时,它是这样的:

  1. 在解决方案资源管理器中复制xaml。
  2. 在解决方案资源管理器中重命名xaml。
  3. 重命名xaml中的x:Class。
  4. 重命名xaml.cs中的类名。
  5. 重命名xaml.cs中的构造函数。
  6. 为什么一切仍然破碎? &lt; ==(你可能在这里)
  7. 意识到下面有秘密伏都教巫术。
  8. 将xaml和xaml.cs的内容复制到几个记事本中。
  9. 从解决方案资源管理器中删除xaml。
  10. 使用您想要的名称在解决方案资源管理器中创建一个新的xaml。
  11. 用两个记事本的确切内容覆盖xaml和xaml.cs。
  12. 错误消失了。

答案 2 :(得分:0)

通过删除xaml中的所有xlmns元素并让resharper自动将它们重新添加来解决该问题。我对此解决方案不满意,因为它不符合逻辑;但它确实解决了编译错误。