Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 窗口内容更改:指定的元素已经是逻辑子元素_C#_Wpf_Invalidoperationexception - Fatal编程技术网

C# 窗口内容更改:指定的元素已经是逻辑子元素

C# 窗口内容更改:指定的元素已经是逻辑子元素,c#,wpf,invalidoperationexception,C#,Wpf,Invalidoperationexception,所以我意识到这是一个经常被问到的错误,我读了很多谷歌的结果,但我仍然不知道它如何适用于我的情况 设置:我创建一个窗口来显示视图。我创建了第一个视图的实例,并将窗口的内容属性设置为该视图。目前,我的每个视图本身就是一个窗口。这在7/10计算机上运行得很好。但是,由于某些原因,在一些计算机上(验证为正确的.NET版本),切换到第二个视图(创建第二个视图的实例并将窗口的内容属性设置为第二个视图)会抛出System.InvalidOperationException指定的元素已经是另一个元素的逻辑子元素

所以我意识到这是一个经常被问到的错误,我读了很多谷歌的结果,但我仍然不知道它如何适用于我的情况

设置:我创建一个窗口来显示视图。我创建了第一个视图的实例,并将窗口的内容属性设置为该视图。目前,我的每个视图本身就是一个窗口。这在7/10计算机上运行得很好。但是,由于某些原因,在一些计算机上(验证为正确的.NET版本),切换到第二个视图(创建第二个视图的实例并将窗口的内容属性设置为第二个视图)会抛出System.InvalidOperationException指定的元素已经是另一个元素的逻辑子元素。先把它断开

我读到使用ContentTemplate而不是内容可以解决问题,但这只会产生一个空白屏幕而不是第二个视图(我肯定我做得不对)

我还读到,应该使用UserControl而不是Window作为窗口的内容属性,因此我正在尝试(我没有收到此错误的计算机,因此我必须等待成功的消息)。但在我看来,这并不会真正改变什么

你知道为什么这种情况只发生在一些计算机上吗?你知道如何修复它吗

编辑:将视图更改为UserControls并不能解决此问题

编辑:我意识到我说错了。我没有将主窗口的内容设置为窗口,而是将其设置为第二个窗口的内容。就像:

MainWindow.Content = nextScreen.Content;

谢谢大家的回答。我发现将视图更改为UserControls是正确的路径。当我第一次尝试时,我犯了这个错误:

window.Content = userControl.Content;
而不是

window.Content = userControl;
在我的机器上仍然工作,但在以前有问题的计算机上继续出现故障


我仍然不明白为什么只有少数几台计算机对此抛出异常。显然他们之间有一些区别,虽然它不像Windows版本或处理器体系结构那样明显。

鉴于Windows类重写OnAncestorChanged,并且如果您尝试将其设置为父级,则会引发异常,我不确定您将如何使用窗口,但如果您想找出当前的逻辑父级是谁,则应在上使用LogicalTreeHelper.GetParent您试图设置为Content.LogicalTreeHelper.GetParent的对象返回null,这是预期的,因为我只是实例化视图,然后将其分配给窗口的Content设置ContentControl的内容将使该对象(假定其为DependencyObject)成为该ContentControl的逻辑子对象。窗口是一个ContentControl,因此如果您正在设置的内容是DO(例如元素),则异常是正确的。您需要将第一个窗口的内容放入局部变量,将该窗口的内容设置为null,然后将第二个窗口的内容设置为局部变量。@AndrewS您应该将这三行代码作为答案发布。