我正在使用带有WPF和C#5.0的.Net 4.5.2。我在WPF项目中创建了一个Window。我想在解决方案资源管理器中复制粘贴此窗口,创建第二个窗口,并将其重命名为新名称。
当我这样做时,新的(复制的)窗口的InitializeComponent()方法总是给我一个错误。如何在解决方案资源管理器中干净地复制窗口(及其代码等)?
这个问题部分得到了解答:Copy pasting WPF window gives error但答案并没有解决我的问题。
我的方法(不起作用):
预期:没有错误,复制(克隆)操作成功
实际:编译错误"无法访问非静态方法' InitializeComponent'在静态环境中#34;
我只有这一个错误。显然,InitializeComponent()正在成为一个模棱两可的参考,但我不清楚如何对代码进行手动编辑来解决这个问题。我希望VS或Resharper会自动帮我解决这个问题。
更新
WindowTest包含两个我之前未提及的userControl。发生复制/粘贴后,由于某种原因,以下xaml元素在WindowTestCopy中变得格式不正确:
的xmlns:用户控件....(ellided) 的xmlns:用户控件....(ellided)
通过删除这些,Resharper确定userControl对象缺少xmlns引用标记,并询问我是否要自动导入它们。我选择了是的。在Resharper添加了缺少的xmlns引用标记后,我能够编译(所有错误都消失了)。
我没有解释为什么会这样。在我重现的步骤中,我不编辑xaml,因此它应该与原始xaml相同。这是一种奇怪的行为,但至少有一种解决方法如上所述。
答案 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)
当它发生在我身上时,它是这样的:
答案 2 :(得分:0)
通过删除xaml中的所有xlmns元素并让resharper自动将它们重新添加来解决该问题。我对此解决方案不满意,因为它不符合逻辑;但它确实解决了编译错误。