【问题标题】:Disconnect image: Specified Visual is already a child of another Visual or the root of a CompositionTarget断开图像:指定的视觉对象已经是另一个视觉对象的子对象或 CompositionTarget 的根
【发布时间】:2012-07-31 08:14:59
【问题描述】:

我正在尝试在 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 中取出卡片,图像也不会立即断开连接。那么如何强制断开连接呢?

希望我的问题足够清楚。

【问题讨论】:

    标签: c# wpf image children disconnect


    【解决方案1】:

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

    但是,您的方法存在一个普遍问题。当您还打算在应用程序的其他位置显示这些图像时,不应将 Image 控件用作 ListView 项。使用ImageSource 作为项目类型(将ItemsSouce 设置为ObservableCollection&lt;ImageSource&gt;)并为您的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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      相关资源
      最近更新 更多