代码之家  ›  专栏  ›  技术社区  ›  Tornike Gomareli

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

  •  0
  • Tornike Gomareli  · 技术社区  · 6 年前

    我对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 回复  |  直到 6 年前
        1
  •  1
  •   Nawed Nabi Zada    6 年前

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

    设想以下设置:

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

    例外会消失!