【发布时间】:2014-03-05 16:03:26
【问题描述】:
这可能是一个非常基本的问题。我有一个画布,我在运行时放置了不同的元素(文本框、形状、按钮)。现在我希望能够将这些元素拖放到同一画布上的另一个位置。
谁能给我一些代码,如何在运行时实现类似 onDrag 的东西?
【问题讨论】:
标签: c# .net user-interface canvas pixelsense
这可能是一个非常基本的问题。我有一个画布,我在运行时放置了不同的元素(文本框、形状、按钮)。现在我希望能够将这些元素拖放到同一画布上的另一个位置。
谁能给我一些代码,如何在运行时实现类似 onDrag 的东西?
【问题讨论】:
标签: c# .net user-interface canvas pixelsense
您可以使用例如 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)
【讨论】: