1

私はMVVMの設計パターンを学んでいるので、いくつかの操作をコマンドに変更しようとしています。
例を次に示します。MainWindow にはキャンバスがコンテナーとしてあり、ユーザーはドラッグして四角形を描くことができます。だから私は以下のようにコードを書く

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    base.OnMouseLeftButtonDown(e);
    StartPoint = e.GetPosition(this);      
    shape = new Rectangle();
    shape.Fill = Brushes.Transparent;
    shape.Stroke = Brushes.Black;
    shape.StrokeThickness = 1;
    this.Children.Add(shape);
}

protected override void OnMouseMove(MouseButtonEventArgs e)
{
    Point endpoint = e.GetPosition(this);
    double left = Math.Min(endpoint.X, StartPoint.X);
    double top = Math.Min(endpoint.Y, StartPoint.Y);
    shape.Margin = new Thickness(left, top, 0, 0);
    shape.Width = Math.Abs(endpoint.X - StartPoint.X);
    shape.Height = Math.Abs(endpoint.Y - StartPoint.Y);
    shape.Stroke = Brushes.Black;
    shape.StrokeThickness = 2;
}

protected override void OnMouseLeave(MouseButtonEventArgs e)
{
    //end
}

元に戻す機能を追加して、元に戻すが呼び出された後に四角形が消えるようにしたいので、これらの3つのステップを1つのコマンドにしたいと思います。どうすればいいですか?ありがとう。

4

1 に答える 1

1

Microsoft の Expression Blend Behaviors がこれを行います。独自の動作を実装して使用するには、Expression Blend は必要ありません。ダウンロード可能な SDK だけが必要です。

それが機能する方法は、 T : DependencyObject である Behavior を実装することです。このクラスには、オーバーライド可能な 2 つのメソッド OnAttach() と OnDetach() があり、これらをイベントにワイヤリングおよびワイヤリング解除し、上記のロジックをビヘイビア内に配置します。クラスに DrawRectangleBehavior という名前を付ける場合、必要なことは次のとおりです。

....
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
....

<Canvas>
    <i:Interaction.Behaviors>
        <myBlend:DrawRectangleBehavior />
    </i:Interaction.Behaviors>
</Canvas>

そして動作(私はこれをテストしませんでした)

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interactivity;
using System.Windows.Media;
using System.Windows.Shapes;

namespace MyCompany.Common.Behaviors
{
    public class DrawRectangleBehavior : Behavior<Canvas>
    {
        Point StartPoint;
        Shape shape;

        protected override void OnAttached()
        {
            AssociatedObject.PreviewMouseLeftButtonDown += OnMouseLeftButtonDown;
            AssociatedObject.PreviewMouseMove += OnMouseMove;
            AssociatedObject.MouseLeave += OnMouseLeave;
        }

        protected override void OnDetaching()
        {
            AssociatedObject.PreviewMouseLeftButtonDown -= OnMouseLeftButtonDown;
        AssociatedObject.PreviewMouseMove -= OnMouseMove;
        AssociatedObject.MouseLeave -= OnMouseLeave;
        }


        protected void OnMouseLeftButtonDown(object o, MouseButtonEventArgs e)
        {
            StartPoint = e.GetPosition(AssociatedObject);
            shape = new Rectangle();
            shape.Fill = Brushes.Transparent;
            shape.Stroke = Brushes.Black;
            shape.StrokeThickness = 1;
            AssociatedObject.Children.Add(shape);
        }

        protected void OnMouseMove(object o, MouseEventArgs e)
        {
            Point endpoint = e.GetPosition(AssociatedObject);
            double left = Math.Min(endpoint.X, StartPoint.X);
            double top = Math.Min(endpoint.Y, StartPoint.Y);
            shape.Margin = new Thickness(left, top, 0, 0);
            shape.Width = Math.Abs(endpoint.X - StartPoint.X);
            shape.Height = Math.Abs(endpoint.Y - StartPoint.Y);
            shape.Stroke = Brushes.Black;
            shape.StrokeThickness = 2;
        }

        protected void OnMouseLeave(object o, MouseEventArgs e)
        {
            //end
        }

    }
}

そして、再利用可能なコードができました。

次のチュートリアルを参照してくださいWPF チュートリアル | ブレンド動作

そして、次のダウンロード リンクExpression Blend SDK

于 2012-11-20T14:28:21.373 に答える