首页 文章

在附加到新的父Visual之前,必须断开指定的子视图与当前父Visual

提问于
浏览
0

我是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 回答

  • 1

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

    想象一下以下设置:

    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);
    }
    

    异常将消失!

相关问题