2016-05-24 33 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) 
} 

建议:

  • 使用sender参数来获得当前Rectangle
  • 您可能会丢失_isRectDragInProg boolean ...请改用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