gpt4 book ai didi

c# - 如何移动由 WPF Canvas 上的按钮创建的形状?

转载 作者:行者123 更新时间:2023-11-30 16:48:59 24 4
gpt4 key购买 nike

我是 C# 和 WPF 的新手,想创建一个使用按钮绘制形状的 WPF 应用程序。然后形状需要能够在 Canvas 上移动。当我在 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 中绘制的红色方 block 的代码。我怎样才能对按钮创建的绿色按钮执行相同的操作?

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

最佳答案

您应该为此 Rectangle 绑定(bind)鼠标事件:

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 bool 值...改为使用 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);
}

关于c# - 如何移动由 WPF Canvas 上的按钮创建的形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37409631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com