0

WPF でカード ゲームを作成しようとすると、次のエラーが表示されます: 指定されたビジュアルは既に別のビジュアルの子であるか、CompositionTarget のルートです。リストビューを含むウィンドウがあります(handListviewという名前)。リストビューの itemssource はに設定されています

ObservableCollection<System.Windows.Controls.Image>

_hand と呼ばれます。

画像をホバーすると、マウスムーブ イベントでホバーした画像ソースを再生キャンバスの横にある Image コントロール (LargeCardPreview と呼ばれる) .source に追加することで、ホバーした画像の拡大が表示されます。

画像をダブルクリックすると、その画像が _hand から削除され、子要素として playCanvas という再生キャンバスに追加されます。(私は playCanvas.Children.Add を使用します)。

ここで問題が発生します。画像をダブルクリックすると、_hand コレクションからカードが削除され (最初は、要素がコレクションにバインドされているため、HandListView から要素が切断されると考えられていました)、「OnCardPlayed」イベントがトリガーされます。 . この場合でも、カードを playCanvas.Children コレクションに追加します。しかし、その後エラーが発生します。

LargeImagePreview がブロックしているせいかもしれないと思ったので、ソースを Null に設定しました。変化なし。

_hand observablecollection からカードを削除しても、イメージがすぐに切断されないためだと思います。では、強制的に切断するにはどうすればよいでしょうか。

私の質問が十分に明確であることを願っています。

4

1 に答える 1

0

プログラムの動作を説明するだけでなく、関連するコード部分も投稿することを検討する必要があります。

ただし、アプローチには一般的な問題が 1 つあります。これらのイメージをアプリケーションの他の場所にも表示する場合は、イメージコントロールを ListView 項目として使用しないでください。ImageSourceをアイテム タイプとして使用ItemsSouceし( に設定ObservableCollection<ImageSource>)、ListView に適切なItemTemplateを定義します。

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

たとえば、ListViewSelectedItemを 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 に答える