这可能是一个非常基本的问题。我有一个画布,我在运行时(TextBoxes,Shapes,Buttons)放置了不同的元素。现在我希望能够将这些元素拖放到同一画布上的另一个位置。
任何人都可以为我提供一些代码,如何在运行时实现像onDrag这样的东西?
答案 0 :(得分:0)
您可以使用MouseDown,MouseMove和MouseUp事件,然后使用MouseEventArgs的GetPosition(element),它返回相对于元素的坐标(有更多事件公开此方法)。
此外,利用RoutedEvent的OriginalSource来检查画布中的哪个元素被点击(在这种情况下,它只是矩形)。
以下是一个例子:
<Grid>
<Canvas Name="MyCanvas" PreviewMouseLeftButtonDown="OnMouseDown" MouseMove="OnMouseMove">
<Rectangle Width="20" Height="20" Canvas.Left="10" Canvas.Top="10" Fill="Blue"/>
<Rectangle Width="20" Height="20" Canvas.Left="50" Canvas.Top="10" Fill="Red"/>
</Canvas>
</Grid>
代码隐藏:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
AddHandler(Mouse.MouseUpEvent, new MouseButtonEventHandler(OnMouseUp), true);
}
private bool _isBeingDragged;
public void OnMouseDown(object sender, MouseEventArgs args)
{
if (!(args.OriginalSource is Canvas))
{
_isBeingDragged = true;
}
}
public void OnMouseMove(object sender, MouseEventArgs args)
{
if (_isBeingDragged)
{
var elementBeingDragged = (FrameworkElement) args.OriginalSource;
var position = args.GetPosition(MyCanvas);
Canvas.SetLeft(elementBeingDragged, position.X - elementBeingDragged.ActualWidth / 2);
Canvas.SetTop(elementBeingDragged, position.Y - elementBeingDragged.ActualHeight / 2);
}
}
public void OnMouseUp(object sender, MouseEventArgs args)
{
_isBeingDragged = false;
}
}
我必须使用UIElement的AddHandler方法注册MouseUp,因为它已被标记为Handled(AddHandler方法允许您为先前已处理的事件注册事件处理程序,ieeHandled = true)