2016-05-24 5 views
3

Ich bin sehr neu in C# und WPF und würde eine WPF-Anwendung erstellen, die Formen mit einer Schaltfläche zeichnet. Die Formen müssen sich dann auf der Leinwand bewegen können. Wenn ich eine Form im XAML erzeuge, bewegt es sich. Allerdings kann ich den mit dem Button erstellten nicht bewegen. Könnte jemand bitte helfen? Unten sind der XAML und der Code, den ich verwende.Wie kann ich die Form verschieben, die mit einer Schaltfläche auf der Zeichenfläche in WPF erstellt wurde?

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> 

Dies ist der Code, den ich das rote Quadrat in XAML gezogen zu bewegen verwenden. Wie kann ich das Gleiche für den grünen Button tun?

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); 
    } 

Antwort

1

Sie sollten die Mausereignisse für dieses Rectangle binden:

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) 
} 

Empfehlungen:

  • Verwenden sender Parameter den aktuellen Rectangle zu erhalten.
  • Sie können verlieren _isRectDragInProg boolean ... verwenden Sie stattdessen die IsMouseCaptured-Eigenschaft.

Zum Beispiel:

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

Danke, guter Herr! Einige Anpassungen waren notwendig, aber insgesamt hat dies mir geholfen, die Idee zu verstehen. Die Empfehlungen werden ebenfalls geschätzt. :) – Greengored

Verwandte Themen