Необходимо отключить указанный дочерний элемент от текущего родительского Visual перед подключением к новому родительскому Visual - PullRequest
0 голосов
/ 10 декабря 2018

Я новичок в 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 голосов
/ 10 декабря 2018

Суть в том, что если элемент уже имеет логического родителя, вы не можете назначить его другим дочерним элементом.

Представьте себе следующую настройку:

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

И исключение исчезнет!

...