0

我正在尝试将一个项目从一个画布拖到另一个画布上。我希望在对象进入另一个画布时触发一个事件。似乎没有任何 Drag 事件触发。我已尝试遵循此问题的解决方案,但它对我不起作用: 拖放未按预期响应

我的画布是这样的:

<Window x:Class="DragEnterTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="DragEnterMainWindow" Height="460" Width="1000">
<Grid>
    <Canvas Name="Toolbox" Background="Beige" Height="400" Width="200" Margin="12,12,800,35">
        <Rectangle Name="dragRectangle" Canvas.Left="0" Canvas.Right="0" Width="50" Height="50" Fill="Red"
                   MouseLeftButtonDown="dragRectangle_MouseLeftButtonDown"
                   MouseLeftButtonUp="dragRectangle_MouseLeftButtonUp"
                   MouseMove="dragRectangle_MouseMove"
                   />
    </Canvas>
    <Canvas Background="Azure" Height="400" Margin="218,12,0,35" Name="mainCanvas" Panel.ZIndex="-1"
            DragEnter="mainCanvas_DragEnter"
            DragLeave="mainCanvas_DragLeave"
            PreviewDragEnter="mainCanvas_PreviewDragEnter"
            PreviewDragLeave="mainCanvas_PreviewDragLeave"
            AllowDrop="True"
            DragDrop.Drop="mainCanvas_Drop"
            />
</Grid>
</Window>

如果我没有 Panel.ZIndex="-1",则将矩形拖到 mainCanvas 下方。即使我将矩形的 ZIndex 设置为某个正值也是如此。

我的代码如下,由我发现的示例修改:

namespace DragEnterTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    private bool _isRectDragInProg;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void dragRectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _isRectDragInProg = true;
        dragRectangle.CaptureMouse();
    }

    private void dragRectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        _isRectDragInProg = false;
        dragRectangle.ReleaseMouseCapture();
    }

    private void dragRectangle_MouseMove(object sender, MouseEventArgs e)
    {
        if (!_isRectDragInProg) return;
        // get the position of the mouse relative to the Canvas
        var mousePos = e.GetPosition(Toolbox);

        // center the rect on the mouse
        double left = mousePos.X - (dragRectangle.ActualWidth / 2);
        double top = mousePos.Y - (dragRectangle.ActualHeight / 2);
        Canvas.SetLeft(dragRectangle, left);
        Canvas.SetTop(dragRectangle, top);
    }

    private void mainCanvas_DragEnter(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }

    private void mainCanvas_DragLeave(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }

    private void mainCanvas_PreviewDragEnter(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }

    private void mainCanvas_PreviewDragLeave(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }

    private void mainCanvas_Drop(object sender, DragEventArgs e)
    {
        string t = "Test";  // Never enters this event
    }
}

}

4

2 回答 2

2

您实际上并没有拖动任何东西,只是在画布中到处移动矩形。

当您的矩形离开源时,您需要调用DragDrop.DoDragDrop函数,并将其与源分离,以便稍后将其添加到目标。

    // Drag - In mousemove event when mouse has gone out of toolbox
    DragDrop.DoDragDrop(
        Toolbox, 
        new DataObject("MyWPFObject", rectangle),
        DragDropEffects.Move
    );

    // Drop - In Drop event of target
    if (e.Data.GetDataPresent("MyWPFObject"))
    { 
       var rectangle = e.Data.GetData("MyWPFObject") as Rectangle
    ....

教程 ...

于 2012-07-03T08:59:21.257 回答
0

我相信这是因为您正在捕获鼠标,所以所有鼠标事件都由您的 dragged 处理Rectangle,并且它们不会传递给您的Canvas

我个人在使用 WPF 的内置拖放功能时遇到了各种问题,所以我最终MouseEvents改用了。

我使用的解决方案来自这个答案,并且是这样的:

  1. 按下MouseDown左键,记录位置(MouseLeave删除位置)

  2. On MouseMove,如果左键按下,位置被记录,并且当前鼠标位置的差异超过 delta,设置一个标志,表示拖动操作正在进行中并让您的应用程序(而不是拖动的对象)捕获鼠标

  3. MouseMove在进行拖动操作时,使用命中测试来确定矩形应该在哪里(忽略矩形本身)并相应地调整其父级和位置。

  4. OnMouseUp正在进行拖动操作,释放鼠标捕获并清除“正在进行拖动操作”标志

于 2012-07-03T13:02:37.763 回答