1

私は Silverlight を初めて使用するので、知識不足のために何かを見落としている可能性があります。生成後に画面上でクリック アンド ドラッグできる Rectangles を使用するアプリを作成しています。長方形を生成する関数があります:

    public void formatBox(block b)
    {
        Rectangle Rec = new Rectangle();
        Rec.Height = 100;
        Rec.Width = 200;
        SolidColorBrush newBrush = new SolidColorBrush();
        newBrush.Color = b.blockColor;
        SolidColorBrush blackBrush = new SolidColorBrush();
        blackBrush.Color = Colors.Black;
        Rec.StrokeThickness = 4;
        Rec.Stroke = blackBrush;
        Rec.Fill = newBrush;
        Canvas.SetTop(Rec, generateY(b.locationY));
        Canvas.SetLeft(Rec, generateX(b.locationX));
        TextBlock blockname = new TextBlock();
        blockname.Text = b.blockText;
        blockname.FontSize = 25;
        canvas1.Children.Add(Rec);
        canvas1.Children.Add(blockname);
        Binding topbinding = new Binding("Top");
        Binding leftbinding = new Binding("Left");
        topbinding.Mode = BindingMode.OneWay;
        leftbinding.Mode = BindingMode.OneWay;
        topbinding.Source = Rec.GetValue(Canvas.TopProperty);
        leftbinding.Source = Rec.GetValue(Canvas.LeftProperty);
        blockname.SetBinding(Canvas.TopProperty, topbinding);
        blockname.SetBinding(Canvas.LeftProperty, leftbinding);
        Rec.MouseLeftButtonDown += new MouseButtonEventHandler(Handle_MouseDown);
        Rec.MouseMove += new MouseEventHandler(Handle_MouseMove);
        Rec.MouseLeftButtonUp += new MouseButtonEventHandler(Handle_MouseUp);
    }

これらの長方形は、ブロック クラスから構築されます。

public class block
    {
        public double locationX { get; set; }
        public double locationY { get; set; }
        public Color blockColor { get; set; }
        public string blockText { get; set; }
        public block(double x, double y, Color c, string s)
        {
            this.locationX = x;
            this.locationY = y;
            this.blockColor = c;
            this.blockText = s;
        }
    }

そして私のマウスイベントハンドラ:

    bool isMouseCaptured;
    double mouseVerticalPosition;
    double mouseHorizontalPosition;

    public void Handle_MouseDown(object sender, MouseEventArgs args)
    {
        Rectangle item = sender as Rectangle;
        mouseVerticalPosition = args.GetPosition(null).Y;
        mouseHorizontalPosition = args.GetPosition(null).X;
        isMouseCaptured = true;
        item.CaptureMouse();
    }

    public void Handle_MouseMove(object sender, MouseEventArgs args)
    {
        Rectangle item = sender as Rectangle;
        if (isMouseCaptured)
        {

            // Calculate the current position of the object.
            double deltaV = args.GetPosition(null).Y - mouseVerticalPosition;
            double deltaH = args.GetPosition(null).X - mouseHorizontalPosition;
            double newTop = deltaV + (double)item.GetValue(Canvas.TopProperty);
            double newLeft = deltaH + (double)item.GetValue(Canvas.LeftProperty);

            // Set new position of object.
            item.SetValue(Canvas.TopProperty, newTop);
            item.SetValue(Canvas.LeftProperty, newLeft);

            // Update position global variables.
            mouseVerticalPosition = args.GetPosition(null).Y;
            mouseHorizontalPosition = args.GetPosition(null).X;
        }
    }


    public void Handle_MouseUp(object sender, MouseEventArgs args)
    {
        Rectangle item = sender as Rectangle;
        isMouseCaptured = false;
        item.ReleaseMouseCapture();
        mouseVerticalPosition = -1;
        mouseHorizontalPosition = -1;
    }

移動しようとしているテキストは、formatBox() で blockname と呼ばれます。ここでわかるように、バインディングを試してみましたが、これを行うためのより簡単な方法についての私の知識にはギャップがあると思います. いずれにせよ、マウスイベントハンドラーがトリガーされたときにブロックがその下に移動すると、テキストが移動するようにしたいと思います。テキストを一緒に移動するにはどうすればよいですか?

4

1 に答える 1

1

既にマウスハンドラーがあるので、バインドをスキップしてコードを使用することができます。(いずれにせよ、バインドは期待どおりに機能しません。テキストは、reactangle と同じ座標を持つため、四角形の上/左の線の上に描画されます。これは見た目が悪く、テキストが読みにくくなります。反応角の内側または外側になるようにテキストをオフセットします)。基本的にMouseDown、マウスが押されたことを示すフラグを高く設定し、マウスの位置を記録します。次にMouseMove、フラグを確認します。オンの場合は、現在の位置 + に記録されたポイントから移動した距離として、長方形の新しい位置を計算しますMouseDown。テキストの位置は、新しい位置 + オフセットになります。

ところで、formatBox のようなメソッドを複数の小さなメソッドに分割し、変数に適切な名前を付けることをお勧めします。これにより、コードが読みやすくなるだけでなく、保守しやすくなります。

編集 して移動する四角形を見つけ、MouseDwon ハンドラー内のすべての要素に対してヒット テストを実行します。このようなもの:

Rectangle rectangleUnderMouse = null;
foreach( var rec in rectangles )
{
  if( VisualTreeHelper.HitTest( rec, pointWhereMouseIs ) )
  {
    rectangleUnderMouse = rec;
    break;
  }
}

編集 申し訳ありませんが、移動するテキストブロックを尋ねたのを見ませんでした..それは簡単です:Dictionary<Rectangle,TextBlock>メインクラス内に a を保持できます:

public void formatBox(block b)
{
  //...
  myDictionary[ Rec ] = textblock;
}

public void Handle_MouseMove( object sender, MouseEventArgs args ) 
{
  //...
  textBlockForThisRect = myDictionary[ item ];
  //move textBlockForThisRect
}
于 2012-12-20T15:42:20.457 に答える