我试图在WPF中创建一个纸牌游戏,我得到了错误:指定的视觉已经是另一个视觉的孩子或CompositionTarget的根。我有一个包含列表视图的窗口(名为: handListview)。列表视图的itemssource设置为
ObservableCollection<System.Windows.Controls.Image>叫做_hand。
当我悬停图像时,它显示了悬停图像的放大,方法是让鼠标移动事件将悬停图像源添加到play canvas旁边的图像控件(名为LargeCardPreview) .source中。
当我双击一个图像时,我会将它从_hand中删除,并作为一个子元素添加到名为playCanvas的play画布中。(我使用playCanvas.Children.Add)。
这就是问题所在,当我双击图像时,我从_hand集合中删除了卡片(最初认为这会断开元素与HandListView的连接,因为它绑定到了集合),并触发了一个"OnCardPlayed“事件。在这里,我甚至将卡片添加到playCanvas.Children集合中。但后来我得到了错误。
我认为这可能是因为LargeImagePreview阻止了它,所以我将源设置为空。没有变化。
所以我猜这是因为即使我从_hand可见集合中删除了卡,图像也不会立即断开连接。那么我如何强制断开连接呢?
希望我的问题足够清楚。
发布于 2012-07-31 17:16:40
与其仅仅试图描述你的程序做了什么,你还应该考虑发布相关的代码部分。
然而,你的方法有一个普遍的问题。如果还打算在应用程序的其他位置显示这些图像,则不应将Image控件用作ListView项。使用ImageSource作为项目类型(将ItemsSouce设置为ObservableCollection<ImageSource>),并为您的ListView定义适当的ItemTemplate。
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>现在,当您将ListView的SelectedItem添加到画布时,您将创建一个新的Image控件:
Image image = new Image { Source = list.SelectedItem as ImageSource };
Canvas.SetLeft(image, ...);
Canvas.SetTop(image, ...);
canvas.Children.Add(image);https://stackoverflow.com/questions/11735845
复制相似问题