Отключить изображение: указанный визуальный элемент уже является дочерним элементом другого визуального элемента или корнем CompositionTarget.

Я пытаюсь создать карточную игру в WPF и получаю сообщение об ошибке: Указанный визуальный элемент уже является дочерним элементом другого визуального элемента или корнем CompositionTarget. У меня есть окно со списком в нем (с именем: handListview). Источник элементов списка установлен на

ObservableCollection<System.Windows.Controls.Image>

называется _hand.

Когда я наводил курсор на изображение, он показывает увеличение наведенного изображения, когда событие mousemove добавляет источник наведенного изображения в элемент управления Image (называемый LargeCardPreview) .source рядом с холстом воспроизведения.

Когда я дважды щелкаю изображение, я удаляю его из _hand и добавляю в качестве дочернего элемента на игровой холст с именем playCanvas. (Я использую playCanvas.Children.Add).

Вот где возникает проблема: когда я дважды щелкаю изображение, я удаляю карту из коллекции _hand (что на первый взгляд может отключить элемент от HandListView, поскольку он был привязан к коллекции) и запускает событие «OnCardPlayed». . В этом даже я добавляю карту в коллекцию playCanvas.Children. Но потом я получаю ошибку.

Я подумал, что это может быть из-за того, что LargeImagePreview блокировал его, поэтому я установил источник на Null. Без изменений.

Так что я предполагаю, что это потому, что, хотя я удаляю карту из наблюдаемой коллекции _hand, изображение не отключается немедленно. Итак, как мне принудительно отключиться?

Надеюсь, что мой вопрос достаточно ясен.


person Daniel Olsen    schedule 31.07.2012    source источник


Ответы (1)


Вместо того, чтобы просто пытаться описать, что делает ваша программа, вы должны также опубликовать соответствующие части кода.

Однако есть одна общая проблема с вашим подходом. Вы не должны использовать элементы управления Image в качестве элементов ListView, если вы также собираетесь отображать эти изображения. в других местах вашего приложения. Используйте ImageSource в качестве типа элемента (задайте ItemsSouce значение ObservableCollection<ImageSource> ) и определите соответствующий ItemTemplate для вашего ListView .

<ListView>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Теперь, когда вы добавляете, например, SelectedItem ListView в Canvas, вы должны создать новый элемент управления Image:

Image image = new Image { Source = list.SelectedItem as ImageSource };
Canvas.SetLeft(image, ...);
Canvas.SetTop(image, ...);
canvas.Children.Add(image);
person Clemens    schedule 31.07.2012