WPFのBehavior

10870 ワード

本稿では,主にドラッグ要素の実装を例とする.
Behaviorの作成:
通常、このクラスはBehaviorから継承され、ここでTはこのBehaviorサービスのオブジェクトであり、ここではUIElement、つまりあるがあるUIElementタイプの要素を使用することができる.
 public class DragInCanvasBehavior : Behavior<UIElement>

    {

        //     

        private Canvas canvas;

        //        

        private bool isDraging = false;

        //        (          )

        private Point mouseOffset;



        /// <summary>

        ///      

        /// </summary>

        protected override void OnAttached()

        {

            base.OnAttached();

            //      (AssociatedObject        Behavior   )

            this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;

            this.AssociatedObject.MouseMove += AssociatedObject_MouseMove;

            this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;

        }



        void AssociatedObject_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)

        {

            //      

            isDraging = false;

        }



        void AssociatedObject_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)

        {

            //        

            if (isDraging)

            {

                //      

                Point newPoint = e.GetPosition(canvas);

                //               

                mouseOffset.X += newPoint.X - mouseOffset.X;

                mouseOffset.Y += newPoint.Y - mouseOffset.Y;



                //     Left Top,     X(Y)  Width(Height),             

                Canvas.SetLeft(this.AssociatedObject, mouseOffset.X-(this.AssociatedObject as FrameworkElement).ActualWidth/2);

                Canvas.SetTop(this.AssociatedObject, mouseOffset.Y - (this.AssociatedObject as FrameworkElement).ActualHeight/2);

            }

        }



        void AssociatedObject_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)

        {

            //            Canvas(     Canvas,   Canvas      )

            if (canvas == null)

                canvas = (Canvas)VisualTreeHelper.GetParent(this.AssociatedObject);

            //      

            isDraging = true;

            //      

            mouseOffset = e.GetPosition(this.AssociatedObject);

            this.AssociatedObject.CaptureMouse();

        }



        /// <summary>

        ///     

        /// </summary>

        protected override void OnDetaching()

        {

            //      

            this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;

            this.AssociatedObject.MouseMove -= AssociatedObject_MouseMove;

            this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;

        }

    }

 WPFでドラッグを実現するには、通常、MouseLeftButtonDown、MouseLeftButtonUp、MouseMoveの3つのイベントだけでよい.Downイベントは、ドラッグ状態に入り、ドラッグ中に要素の位置を動的に変更するための初期のマウス座標を記録するとともに、現在の要素のParentであるCanvasを得ることで、Move時にCanvasに対する新しい座標を得ることができます.Upイベントの担当状態が正常になり、このとき移動しても変化しません.Moveイベントの責任は、Canvasに対する現在のマウスの新しい座標を取得し、古い座標と計算し、最後に要素の新しい座標を設定することです.
Behaviorの使用:
 注意:Microsoft.Expression.Interactions.dllとSystem.Windows.Interactivity.dllをまだ参照していない場合は、急いで参照してください(Blendがインストールされていない場合は、ダウンロードをクリックしてください).
<Window x:Class="WpfApplication2.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

        xmlns:behavior="clr-namespace:CustomBehaviorsLibrary;assembly=CustomBehaviorsLibrary"

        Title="MainWindow" Height="350" Width="525">

    <Canvas Background="LightBlue">

        <Rectangle Height="50" Width="50" Fill="Green" >

            <i:Interaction.Behaviors>

                <behavior:DragInCanvasBehavior></behavior:DragInCanvasBehavior>

            </i:Interaction.Behaviors>

        </Rectangle>

    </Canvas>

</Window>

InteractivityとBehaviorの属するプログラムとの参照を追加します.ページの内容は簡単です.CanvasにはRectangleが含まれています.RectangleではBehavirosを作成するBehaviorに設定します.不思議なことに、プログラムを実行し、Rectangleをドラッグすると、位置を変えることができますよ.
注意:本明細書の例では、BehaviorとWPFアプリケーションが分離されているため、ここではBehaviorが存在するクラスライブラリへの参照を追加するとともに、WindowラベルにBehaviorが属するAssemblyへの参照を追加する必要があります.BehaviorとXAMLが同じプログラムセットにある場合は、適切な変更を行うことができます.
XAMLのTriggerとActionの組み合わせは、別のログ(SilverlightのStylesとBehaviors)を参照してください.
皆さんの意見やアドバイスをたくさんしてほしいです.コメントがあれば、最初の時間に返事します.