gpt4 book ai didi

c# - 在附加到新的父 Visual 之前,必须断开指定子项与当前父 Visual 的连接

转载 作者:行者123 更新时间:2023-12-05 04:03:12 30 4
gpt4 key购买 nike

我是 WPF 的新手,正在尝试构建我的第一个应用程序,该应用程序是多流的多 View 一起用于学习目的。

我在主窗口上有 24 个多媒体元素,我想全屏显示选定的多媒体元素,再单击一次以最小化这个全屏媒体。

代码是这样的

foreach (var item in MediaElements)
{
item.LoadedBehavior = MediaState.Manual;
item.MouseEnter += mediaElement1_MouseEnter;
item.MouseLeave += mediaElement1_MouseLeave;
item.Loaded += mediaElement1_Loaded;
item.MouseLeftButtonUp += (o, args) =>
{
if(!fullscreen)
{
ListOfMedia.Children.Remove(item);
this.Content = item;
this.WindowStyle = WindowStyle.None;
this.WindowState = WindowState.Maximized;
}
else
{
this.Content = ListOfMedia;
ListOfMedia.Children.Add(item);
this.WindowStyle = WindowStyle.SingleBorderWindow;
this.WindowState = WindowState.Normal;
}

fullscreen = !fullscreen;
};
}

当我第一次点击它时,它工作得很好,窗口正在最大屏幕尺寸,但是当我下次点击它以最小化它时,有一个异常对我说

System.ArgumentException: 'Must disconnect specified child from current parent Visual before attaching to new parent Visual.'

我检查了一些 StackOverflow 问题,但找不到正确的解决方案,有人在谈论从父树中删除 child 的扩展方法,我写了这个扩展方法,但我不知道问题是什么,背后的想法是什么这个问题?我必须删除的内容以及正在发生的事情。

请告诉我这里发生了什么。

最佳答案

整个想法是,如果一个元素已经有一个逻辑父元素,那么你不能将它指定为另一个元素的子元素。

想象一下以下设置:

CtCtrl = ContentControl

StPnl = StackPanel

br1 = Border

if(CtCtrl.Content != null)
{
var br1 = CtCtrl.Content as Border;
StPnl.Children.Add(br1);
}

以上将导致 System.InvalidOperationException:'指定的元素已经是另一个元素的逻辑子元素。先断开它。'

在通过以下代码将元素添加到 StackPanel 之前,您可以轻松地将其孤立:

if(CtCtrl.Content != null)
{
var br1 = CtCtrl.Content as Border;
CtCtrl.Content = null;
StPnl.Children.Add(br1);
}

异常将消失!

关于c# - 在附加到新的父 Visual 之前,必须断开指定子项与当前父 Visual 的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53702436/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com