拖放从WinForms到WPF的问题

15 浏览
0 Comments

拖放从WinForms到WPF的问题

我有一个旧的WinForms应用程序,具有拖放功能(没有任何源代码)。现在我需要创建一个新的WPF应用程序,可以接收来自旧应用程序的一些数据。但是在WPF应用程序中,拖放功能以及任何事件:DragEnterDragOverDragLeaveDrop都无法触发。我已经创建了另一个简单的仅具有拖放功能的WinForms应用程序,它可以正常工作。而且,我可以从这个简单的WinForms应用程序拖放到WPF应用程序中。

我尝试以"管理员"身份运行我的应用程序,或者不以此方式运行 - 没有任何改变。

有人知道如何修复这个问题,或者这种奇怪行为的根本原因是什么吗?

0
0 Comments

问题出现的原因是因为旧的应用程序使用了RegisterDragDrop来注册OleDataFormat,而新的WPF应用程序使用了RegisterDragDrop来注册DataFormat。解决方法是将AllowDrop设置为false,并且使用ole32.dll中的RegisterDragDrop来注册OleDataFormat,使用自定义的IDropTarget接口或者来自WinForms库的RegisterDragDrop。

以下是解决该问题的代码示例:

using System;
using System.Windows;
using System.Windows.Interop;
using System.Runtime.InteropServices;
public class CustomIDropTarget : IDropTarget
{
    // 实现IDropTarget接口的代码
    // ...
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        // 设置AllowDrop为false
        this.AllowDrop = false;
        // 使用ole32.dll中的RegisterDragDrop来注册OleDataFormat
        IntPtr hwnd = new WindowInteropHelper(this).Handle;
        IDropTarget dropTarget = new CustomIDropTarget();
        Ole32Dll.RegisterDragDrop(hwnd, dropTarget);
    }
}
public static class Ole32Dll
{
    [DllImport("ole32.dll")]
    public static extern int RegisterDragDrop(IntPtr hwnd, IDropTarget pDropTarget);
    // 其他ole32.dll中的方法声明
    // ...
}
public interface IDropTarget
{
    // 定义IDropTarget接口的方法
    // ...
}

通过以上代码,我们解决了从WinForms到WPF的拖放问题。

0
0 Comments

这个问题的出现的原因是在WPF中拖放操作没有按照预期地工作。根据提供的信息,问题可能出现在以下几个方面:

1. 是否在WPF的XAML中设置了`AllowDrop="true"`,这是启用拖放操作的必要步骤。

2. 是否在捕获的窗体或控件中处理了`Drop`事件,这是处理拖放操作的关键。

为了解决这个问题,可以参考stackoverflow.com上的这个问题:WPF Drag and Drop,其中提供了更多的细节。

根据问题的描述,问题可能是在以下场景中出现:

- 旧应用程序(具有拖动功能) -> 测试WinForms应用程序(具有拖放功能) -> WPF应用程序

希望实现的场景是:旧应用程序 -> WPF应用程序。

此外,还尝试使用ole32库中的RegisterDragDrop方法,但是返回了错误代码。

虽然我对WPF不太熟悉,但是从C# WinForms中的经验来看,相同的原则也适用于WPF。有时候需要显式处理与FileFormat完全相同的类型。

为了解决这个问题,可能需要检查是否正确设置了`AllowDrop`属性,并确保在捕获的窗体或控件中正确处理了`Drop`事件。此外,还可以参考上述提供的链接,了解更多关于WPF拖放操作的细节。

0