首页 文章

断开连接图像:指定的Visual已经是另一个Visual的子项或CompositionTarget的根

提问于
浏览
0

我正在尝试在WPF中创建一个纸牌游戏,我得到错误:指定的Visual已经是另一个Visual的子项或CompositionTarget的根 . 我有一个带有listview的窗口(名为:handListview) . listview的itemssource设置为

ObservableCollection<System.Windows.Controls.Image>

叫_hand .

当我悬停图像时,它通过鼠标移动事件将悬停的图像源添加到播放画布旁边的Image控件(称为LargeCardPreview).source,显示悬停图像的放大 .

当我双击图像时,我将它从_hand中删除,并作为子元素添加到名为playCanvas的播放画布中 . (我使用playCanvas.Children.Add) .

这就是问题出现的地方,当我双击图像时,我从_hand集合中删除了卡片(最初的想法是将元素与HandListView断开连接,因为它绑定到集合),并触发“OnCardPlayed”事件 . 在这甚至我添加卡到playCanvas.Children集合 . 但后来我得到了错误 .

我认为这可能是因为LargeImagePreview阻止了它,所以我将源设置为Null . 没变 .

所以我猜它是因为即使我从_hand observablecollection中删除了卡片,图像也不会立即断开连接 . 那么如何强行断开连接呢?

希望我的问题足够清楚 .

1 回答

  • 0

    而不是仅仅尝试描述您的程序,您应该考虑发布相关的代码部分 .

    但是你的approch有一个普遍的问题 . 当您还打算在应用程序的其他位置显示这些图像时,不应将Image控件用作ListView项 . 使用ImageSource作为项类型(将 ItemsSouce 设置为 ObservableCollection<ImageSource> )并为ListView定义适当的ItemTemplate .

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

    现在,当您将ListView的 SelectedItem 添加到Canvas时,您将创建一个新的Image控件:

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

相关问题