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

r6hnlfcb  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(340)

我使用.Net 4.5.2与WPF和C# 5.0。我在WPF项目中创建了一个窗口。我想在解决方案资源管理器中复制粘贴此窗口,创建第二个窗口,并将其重命名为新名称。
当我这样做时,新(复制)窗口的InitializeComponent()方法总是给我一个错误。如何在解决方案资源管理器中干净地复制窗口(及其代码等)?
这个问题在这里得到了部分回答:Copy pasting WPF window gives error然而,答案并没有解决我的问题。
我的方法(不起作用):
1.创建一个窗口并将其命名为WindowTest
1.在解决方案资源管理器中,选择“WindowTest”并复制,然后将其粘贴到同一项目中
1.将新复制的Window重命名为WindowTestCopy
1.在WindowTestCopy中,将xaml中的x:class属性更改为WindowTestCopy而不是WindowTest
1.打开WindowTestCopy中的代码,并将所有对WindowTest的引用更改为WindowTestCopy
1.编译
预期:无错误,复制(克隆)操作成功
编译错误“Cannot access non-static method 'InitializeComponent' in static context”。
我只有这一个错误。显然InitializeComponent()正在成为一个模糊的引用,但我不清楚如何手动编辑代码来修复这个问题。我希望VS或Resharper能自动帮助我解决这个问题。
更新
WindowTest包含两个我之前没有提到的userControl。在复制/粘贴发生后,由于某种原因,以下xaml元素在WindowTestCopy中变得格式错误:
xmlns:用户控制器....(省略号)xmlns:用户控制器....(省略号)
通过删除这些,Resharper确定userControl对象缺少xmlns引用标记,并询问我是否要自动导入它们。我选择了yes。在Resharper添加了缺少的xmlns引用标记后,我能够编译(所有错误消失)。
我没有解释为什么会发生这种情况。在我复制的步骤中,我没有编辑xaml,因此它应该与原始xaml相同。这是奇怪的行为,但至少有一个解决方案。

uqxowvwt

uqxowvwt1#

当它发生在我身上时,它是这样的:
1.在解决方案资源管理器中复制xaml。
1.在解决方案资源管理器中重命名xaml。
1.在xaml中重命名x:Class。
1.在xaml.cs中重命名类名。
1.在xaml.cs中重命名构造函数。
1.怎么都坏了〈==(你大概在这里吧)
1.意识到这背后隐藏着伏都教的巫术。
1.将xaml和xaml.cs的内容复制到两个记事本中。
1.从解决方案资源管理器中删除xaml。
1.在解决方案资源管理器中创建一个具有所需名称的新XAML。
1.用两个记事本的确切内容覆盖xaml和xaml.cs。
1.错误消失了。

col17t5w

col17t5w2#

其他人实际上张贴,然后删除有正确的想法,但简要说明为什么。
您遇到的问题是由于同一项目中的类重复......即使在解决方案资源管理器中,您可以轻松复制/粘贴WPF窗体或任何其他类,用户控件类等。复制时,它会将文件名后缀为“- Copy”,如果您立即编译将失败。原因是什么?在类本身中,类名和窗口名是相同的。因此,在这个项目中,你有两个类的示例,希望你能解决重复的问题,我在WPF开发的早期就遇到了同样的问题。
所以,现在我已经解释了为什么它会失败,这里是你需要做的,以纠正这个问题。我在我的示例项目中创建了一个名为“FirstWindowSample”的窗口,因此创建了两个文件FirstWindowSample.xaml和FirstWindowSample.xaml.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"

您需要将.“FirstWindowSample”更改为新窗体所需的任何内容,例如

x:Class="YourProject.SecondWindowSample"

接下来,切换到CODE-BEHIND文件“FirstWindowSample.xaml.cs”。

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

这是类名及其相应构造函数的硬引用。

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

最后,你的项目将有一个完全不同的类名,它不会重复,也不会导致编译错误。第一次遇到这种情况,是的......很难发现。一旦你得到了它,接下来的2-3次就是“哦,是的”复习......之后你就可以不假思索地做了。

ntjbwcob

ntjbwcob3#

这个问题是通过删除XAML中的所有xlmns元素并让Resarper自动将它们添加回来来解决的。但是,它确实解决了编译错误。

mkshixfv

mkshixfv4#

我会用一种更简单的方式告诉你:我有这个相同的问题,你没有,这个错误发生,因为你做了第一个表单的副本(或页面在我的情况下在这里),比你重命名类和文件到你的新类,但看看下面的代码:

<Page x:Class="Advocacy_Software.Pages.PageRegisterCustomer"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Advocacy_Software.Pages"
      mc:Ignorable="d" 
      d:DesignHeight="800" d:DesignWidth="800"
      Title="PageRegisterCustomer" Background="Lavender">

第一行:〈第x页:类=“倡导软件.页面.页面注册客户”也必须更新为〈第x页:类=“倡导软件.页面.页面注册客户副本”。
就这样!我希望能得到帮助!

相关问题