我正在尝试在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中删除了卡片,图像也不会立即断开连接。那么如何强行断开连接?
希望我的问题足够明确。
答案 0 :(得分: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);