5

リストボックス内のアイテムがダブルクリックされたときに視覚効果を作成したいと考えています。これまでのところ、アイテムがマウスに視覚的に接続され、ドロップターゲットに移動できるドラッグアンドドロップ機能があります。その機能から、アイテム コンテナーを取得するのと同じロジックを使用してアイテムをアニメーション化できますが、アイテム コントロールを離れることができません。ListBox からアイテムを削除し、別の場所に視覚的にアニメーション化する方法はありますか? 基本的に、メイン リスト ボックスはカードの手札です。カードがダブルクリックされたときに、手札のリストボックスから捨て札のリストボックスに視覚的に移動したい。現時点では、あるコレクションから別のコレクションにアイテムを移動するロジックは問題ありませんが、このイベントのアニメーションによる視覚的表現が本当に必要です。このようなことを行う方法についてのアイデアや参考文献をいただければ幸いです。

ありがとう、ブランドン

私が試みたことの詳細: 私がまだしっかりと把握していない概念がいくつかあります。ListBox を ItemsControl、リストボックス アイテムである FrameworkElement、および ListBox アイテムに関連付けられたデータ オブジェクトとして渡すメソッドがあります (一部は不要な場合があります)。私がやろうとしたのは、キャンバスであるListBoxItemのFindVisualChildでした。私はそれを行うことができます。私の考えでは、キャンバスをキャンバスまたはビットマップとして何らかの方法で複製し、同じ場所にあるページの子の子に追加し、ListBoxItem を ListBox から削除し、クローンを破棄にアニメーション化したいと考えていました。パイル。アニメーションが完了すると、クローンは削除または非表示になり、そのオブジェクトが廃棄物の山コレクションに追加されると、クローンを効果的に置き換えることができます。

これに関する私の問題は、装飾レイヤーなどを使用してこれを行う簡単な方法があるように感じることです。また、ビジュアル ツリーのさらに上の要素のまったく同じ位置にクローンを配置する方法もわかりません。私はそれに取り組み、他のアプローチを研究し続けるつもりです。誰かがこれについての洞察を共有してくれることを願っています.

4

3 に答える 3

2

Here's some code I worked up to draw a visual to a bitmap. You may be able to adapt this to your needs, and draw the bitmap by adorning the UIElement that represents a common ancestor of the two list views. Note the use of FrameworkElement.TransformToAncestor to get the coordinates of a nested element in terms of an ancestor element.

        public static BitmapSource CreateBitmapFromElement(FrameworkElement element, Double dpiX, Double dpiY)
        {
            Size elementSize = new Size(element.ActualWidth, element.ActualHeight);
            Visual root = GetAdornerDecoratorAncestor(element);
            Rect elementBounds  = element.TransformToAncestor(root).TransformBounds(new Rect(elementSize));

            RenderTargetBitmap rtb = new RenderTargetBitmap((Int32)(elementBounds.Size.Width * dpiX / 96.0),
                                           (Int32)(elementBounds.Size.Height * dpiY / 96.0),
                                           dpiX,
                                           dpiY,
                                           PixelFormats.Pbgra32);

            DrawingVisual dv = new DrawingVisual();
            using (DrawingContext dc = dv.RenderOpen())
            {
                VisualBrush vb = new VisualBrush(root);
                vb.ViewboxUnits = BrushMappingMode.Absolute;
                vb.Stretch = Stretch.None;
                vb.Viewbox = elementBounds;
                dc.DrawRectangle(vb, null, new Rect(new Point(), elementBounds.Size));
            }
            rtb.Render(dv);
            return rtb;
        }

        public static Visual GetAdornerDecoratorAncestor(DependencyObject obj)
        {            
            while(obj != null && !(obj is AdornerDecorator))
            {
                obj = VisualTreeHelper.GetParent(obj);
            }
            return obj as AdornerDecorator;
        }
于 2009-01-07T02:00:06.483 に答える
1

2つのリストボックスが常に同じ位置にある場合は、ダブルクリックしたアイテムを所定の場所、たとえば古いリストと新しいリストの中間にアニメーション化してみることができます。次に、コードを実行してアイテムを新しいリストに移動しますが、そのアイテムのアニメーションをその所定の場所から開始し、新しいリスト内のその場所にアニメーション化するスタイルを使用します。リストのどこに挿入されているかに基づいて、実行時に新しいアイテムの初期オフセットを微調整する必要があります。

于 2009-01-06T00:13:39.087 に答える
1

OK、ビジュアル要素を取得して、その背景を ListItem のビジュアルブラシに設定し、それを他のリスト ボックスにアニメーション化することができます。ストーリーボードの完了イベントが実際に切り替えを行うのを待つことができます。これが私だったら、一方のボックスからもう一方のボックスの端までだけアニメートします。切り替えが十分に速く行われる場合、ユーザーにとっては非常にシームレスに見えるはずです。アイテムがリスト ボックスに入る正確な位置を見つけることは、並べ替え/フィルター処理のルールに基づいてかなり複雑になります。

于 2008-12-31T17:05:48.777 に答える