繁体   English   中英

WPF:将文件拖放到整个窗口中(包括标题栏和窗口边框)

[英]WPF: Drag and drop a file into the whole window (titlebar and window borders included)

在WinForms和其他应用程序(例如Windows记事本)中,您可以将(例如文件)拖放到整个窗口中-包括标题栏和窗口边框。

在WPF中,您只能将文件拖到窗口画布中-尝试将其拖到标题栏或窗口边框上会导致“否”光标。

在此处输入图片说明

如何使普通的WPF窗口(SingleBorderWindow WindowStyle等)接受拖放到整个窗口中?

区别在于,当您设置AllowDrop =“ true”时,WPF不会调用OS DragAcceptFiles API。 DragAcceptFiles将整个窗口注册为放置目标。

您将需要调用并有一个小的窗口过程来处理放置消息。

这是我制作的一个小测试程序,它允许WPF窗口在任何地方接受放置。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

     const int WM_DROPFILES = 0x233;

    [DllImport("shell32.dll")]
    static extern void DragAcceptFiles(IntPtr hwnd, bool fAccept);

    [DllImport("shell32.dll")]
    static extern uint DragQueryFile(IntPtr hDrop, uint iFile, [Out] StringBuilder filename, uint cch);

    [DllImport("shell32.dll")]
    static extern void DragFinish(IntPtr hDrop);


    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);

        var helper = new WindowInteropHelper(this);
        var hwnd = helper.Handle;

        HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
         source.AddHook(WndProc);

        DragAcceptFiles(hwnd, true);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == WM_DROPFILES) 
        {
            handled = true;
            return HandleDropFiles(wParam);
        }

        return IntPtr.Zero;
    }

    private IntPtr HandleDropFiles(IntPtr hDrop)
    {
        this.info.Text = "Dropped!";

        const int MAX_PATH = 260;

        var count = DragQueryFile(hDrop, 0xFFFFFFFF, null, 0);

        for (uint i = 0; i < count; i++)
        {
            int size = (int) DragQueryFile(hDrop, i, null, 0);

            var filename = new StringBuilder(size + 1);
            DragQueryFile(hDrop, i, filename, MAX_PATH);

            Debug.WriteLine("Dropped: " + filename.ToString());
        }

        DragFinish(hDrop);

        return IntPtr.Zero;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM