必须先将指定的子项与当前的父Visual断开连接,然后再附加到新的父Visual

时间:2018-12-10 09:08:35

标签: c# .net wpf winforms

我是WPF的新手,并试图构建我的第一个应用程序,该应用程序是多流的多视图共同用于学习目的。

我在主窗口上有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问题,但找不到正确的解决方案,有人在谈论从父母树中删除子代的扩展方法,我写了此扩展方法,但我不知道问题出在哪里,背后有什么主意。这个问题?我必须删除的内容以及发生的一切。

请告诉我这是怎么回事。

1 个答案:

答案 0 :(得分:2)

整个想法是,如果一个元素已经具有逻辑父元素,那么您就不能将其分配为另一个元素的子元素。

想象一下以下设置:

CtCtrl = ContentControl

StPnl = StackPanel

br1 = Border

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

以上将导致System.InvalidOperationException:'Specified element is already the logical child of another elelemt. Disconnect it first.'

您可以通过以下代码轻松孤立该元素,然后将该元素添加到StackPanel

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

例外会消失!