如何在WPF中移动画布上的按钮创建的形状?

时间:2016-05-24 09:34:06

标签: c# wpf

我是C#和WPF的新手,并且会创建一个使用按钮绘制形状的WPF应用程序。然后,形状需要能够在画布上移动。当我在XAML中创建一个形状时,它会移动。但是我无法通过按钮创建的那个移动。有人可以帮忙吗?以下是我正在使用的XAML和代码。

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 个答案:

答案 0 :(得分: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布尔值...而是使用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);
}