2016-05-11 7 views
1

イベントをトリガーするこれらの3つの機能があります。私はすでに私のニーズの静的バージョンを持っていますが、動的バージョンが必要です。ドラッグ可能なキャンバスに矩形を作るにはどうしたらいいですか?

bool captured = false; 
    double x_shape, x_canvas, y_shape, y_canvas; 
    UIElement source = null; 

    private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     source = (UIElement)sender; 
     Mouse.Capture(source); 
     captured = true; 
     x_shape = Canvas.GetLeft(source); 
     x_canvas = e.GetPosition(canvasPreview).X; 
     y_shape = Canvas.GetTop(source); 
     y_canvas = e.GetPosition(canvasPreview).Y; 
    } 

    private void MouseMove(object sender, MouseEventArgs e) 
    { 
     //MessageBox.Show("test"); 
     if (captured) 
     { 
      double x = e.GetPosition(canvasPreview).X; 
      double y = e.GetPosition(canvasPreview).Y; 
      x_shape += x - x_canvas; 
      Canvas.SetLeft(source, x_shape); 
      x_canvas = x; 
      y_shape += y - y_canvas; 
      Canvas.SetTop(source, y_shape); 
      y_canvas = y; 
     } 
    } 

    private void MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     Mouse.Capture(null); 
     captured = false; 
    } 

は、私が「canvasPreview」と呼ばれるWPFのキャンバスが、私はキャンバスに(現在の静的バージョンでは、私は楕円を使用しています)四角形を追加したい作られてきた、それは上記の機能を持つドラッグ可能でなければなりません。すでに動作していますが、動的にする必要があります。

私があなたを助けてくれることを願っております、ありがとうございます!

+0

は、どのようにそれがない場合は、動的に取り組んでいますか?それは正確に何を意味するのは動的でなければならないのですか?シェイプはドラッグされませんか? – Joe

+0

すみません。静的バージョンは動作していますが、静的ではWPFで作成された楕円はドラッグ可能ですが、楕円(矩形である必要があります)を生成しようとするとドラッグ可能ではありませんが、関数は呼び出されます。 –

+0

関数はキャンバス内にありますか?ブレークポイントをドロップして矩形をドラッグしようとすると、MouseLeftButtonDownに設定されている「ソース」は何ですか? – Joe

答えて

1

このサンプルコードは役に立ちます。

XAML:

<Grid Margin="12"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <StackPanel Grid.Row="0" Orientation="Horizontal"> 
     <Button x:Name="addRectangleButton" Content="Add Rectngle" Click="addRectangleButton_Click"/> 
    </StackPanel> 

    <Canvas Grid.Row="1" x:Name="canvas" Margin="0,12,0,0"> 
     <Rectangle x:Name="rectangle" Width="100" Height="50" Fill="RoyalBlue" MouseDown="rectangle_MouseDown" MouseMove="rectangle_MouseMove" MouseUp="rectangle_MouseUp" Canvas.Left="0" Canvas.Top="0"/> 
    </Canvas> 
</Grid> 

C#が:

bool drag = false; 
    Point startPoint; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    // this creates and adds rectangles dynamically 
    private void addRectangleButton_Click(object sender, RoutedEventArgs e) 
    { 
     // create new Rectangle 
     Rectangle rectangle = new Rectangle(); 
     // assign properties 
     rectangle.Width = 100; 
     rectangle.Height = 50; 
     rectangle.Fill = new SolidColorBrush(Colors.RoyalBlue); 
     // assign handlers 
     rectangle.MouseDown += rectangle_MouseDown; 
     rectangle.MouseMove += rectangle_MouseMove; 
     rectangle.MouseUp += rectangle_MouseUp; 
     // set default position 
     Canvas.SetLeft(rectangle, 0); 
     Canvas.SetTop(rectangle, 0); 
     // add it to canvas 
     canvas.Children.Add(rectangle); 
    } 

    private void rectangle_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     // start dragging 
     drag = true; 
     // save start point of dragging 
     startPoint = Mouse.GetPosition(canvas); 
    } 

    private void rectangle_MouseMove(object sender, MouseEventArgs e) 
    { 
     // if dragging, then adjust rectangle position based on mouse movement 
     if (drag) 
     { 
      Rectangle draggedRectangle = sender as Rectangle; 
      Point newPoint = Mouse.GetPosition(canvas); 
      double left = Canvas.GetLeft(draggedRectangle); 
      double top = Canvas.GetTop(draggedRectangle); 
      Canvas.SetLeft(draggedRectangle, left + (newPoint.X - startPoint.X)); 
      Canvas.SetTop(draggedRectangle, top + (newPoint.Y - startPoint.Y)); 

      startPoint = newPoint; 
     } 
    } 

    private void rectangle_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     // stop dragging 
     drag = false; 
    } 
+1

ありがとうございます!問題は解決された!それはSetLeftとSetTopのプロパティでした。 –

+0

非常に良い、と私はこのコードが助けることを願っています。 –

+0

幸運、私はあなたの成功を望む。 –

関連する問題