0

我正在尝试在 WPF 中创建纸牌游戏,但出现错误:指定的视觉对象已经是另一个视觉对象的子对象或 CompositionTarget 的根。我有一个带有列表视图的窗口(名为:handListview)。列表视图的 itemssource 设置为

ObservableCollection<System.Windows.Controls.Image>

叫_hand。

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

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

这就是问题所在,当我双击图像时,我从 _hand 集合中删除了卡片(起初认为这会将元素与 HandListView 断开连接,因为它已绑定到集合),并触发“OnCardPlayed”事件. 在此,我什至将卡片添加到 playCanvas.Children 集合中。但后来我得到了错误。

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

所以我猜是因为即使我从 _hand observablecollection 中取出卡片,图像也不会立即断开连接。那么如何强制断开连接呢?

希望我的问题足够清楚。

4

1 回答 1

0

您应该考虑发布相关的代码部分,而不是仅仅试图描述您的程序做了什么。

但是,您的方法存在一个普遍问题。当您还打算在应用程序的其他位置显示这些图像时,不应将图像控件用作 ListView 项。使用ImageSource作为项目类型(设置ItemsSouceObservableCollection<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);
于 2012-07-31T09:16:40.393 回答