2016-05-24 2 views
3

私はC#とWPFが新しく、ボタンで図形を描画するWPFアプリケーションを作成します。シェイプはキャンバスの周りを動くことができる必要があります。 XAMLで図形を作成すると、図形が移動します。しかし、ボタンで作成したボタンを動かすことはできません。誰も助けてくれませんか?以下は、私が使用しているXAMLとコードです。キャンバスのボタンで作成した図形をWPFでどのように移動できますか?

XAML:

<Window x:Class="All_test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Canvas x:Name="canvas" > 
    <Button Content="Button" Canvas.Left="250" Canvas.Top="260" Width="75" Click="Button_Click_1" /> 
    <Rectangle x:Name="rect" 
       Height="100" Width ="100" Fill="red" 
       MouseLeftButtonDown="rect_MouseLeftButtonDown" 
      MouseLeftButtonUp="rect_MouseLeftButtonUp" 
      MouseMove="rect_MouseMove" 
       Canvas.Left="342" Canvas.Top="110" /> 
</Canvas> 

これは私がXAMLで描かれた赤い四角を移動するために使用していたコードです。ボタンで作成された緑色のものについては、どうすればいいですか?

public partial class MainWindow : Window 
{ 
    private bool _isRectDragInProg; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 


    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Rectangle rect = new Rectangle(); 
     rect.Fill = new SolidColorBrush(Colors.Green); 
     rect.Stroke = new SolidColorBrush(Colors.Black); 
     rect.Height = 100; 
     rect.Width = 100; 
     rect.StrokeThickness = 4; 
     canvas.Children.Add(rect); 
     InitializeComponent(); 

    } 


    private void rect_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     _isRectDragInProg = true; 
     rect.CaptureMouse(); 
    } 


    private void rect_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     _isRectDragInProg = false; 
     rect.ReleaseMouseCapture(); 
    } 


    private void rect_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (!_isRectDragInProg) return; 

     // get the position of the mouse relative to the Canvas 
     var mousePos = e.GetPosition(canvas); 

     // center the rect on the mouse 
     double left = mousePos.X - (rect.ActualWidth/2); 
     double top = mousePos.Y - (rect.ActualHeight/2); 
     Canvas.SetLeft(rect, left); 
     Canvas.SetTop(rect, top); 
    } 

答えて

1

あなたはこのRectangleのためのマウスイベントバインドする必要があります。

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    Rectangle rect = new Rectangle(); 
    rect.Fill = new SolidColorBrush(Colors.Green); 
    rect.Stroke = new SolidColorBrush(Colors.Black); 
    rect.Height = 100; 
    rect.Width = 100; 
    rect.StrokeThickness = 4; 
    // here 
    rect.MouseLeftButtonDown += rect_MouseLeftButtonDown; 
    rect.MouseLeftButtonUp += rect_MouseLeftButtonUp; 
    rect.MouseMove += rect_MouseMove; 

    canvas.Children.Add(rect); 
    // InitializeComponent(); <--- lose the InitializeComponent here, that's should only be called ones.. (in the constructor) 
} 

推奨事項:

  • 現在Rectangleを取得するためにsenderパラメータを使用します。
  • あなたは_isRectDragInProgブール値を失う可能性があります...代わりにIsMouseCapturedプロパティを使用してください。たとえば、

private void rect_MouseMove(object sender, MouseEventArgs e) 
{ 
    var rect = (Rectangle)sender; 

    if (!rect.IsMouseCaptured) return; 

    // get the position of the mouse relative to the Canvas 
    var mousePos = e.GetPosition(canvas); 

    // center the rect on the mouse 
    double left = mousePos.X - (rect.ActualWidth/2); 
    double top = mousePos.Y - (rect.ActualHeight/2); 
    Canvas.SetLeft(rect, left); 
    Canvas.SetTop(rect, top); 
} 
+0

は、良い先生ありがとうございます!いくつかの調整が必要でしたが、全体的にこれが私の考えを把握するのに役立ちました。勧告も高く評価されています。 :) – Greengored

関連する問題