WPF 与 WindowsFormsHost 拖放

Posted

技术标签:

【中文标题】WPF 与 WindowsFormsHost 拖放【英文标题】:WPF with WindowsFormsHost Drag and Drop 【发布时间】:2021-05-16 02:33:43 【问题描述】:

当我从桌面拖动文件时,我很难在 WindowsFormsHost 上进行拖放,Drop 事件不会触发。

我创建了一个示例项目来演示:

你需要参考WindowsFormsIntegrationSystem.Windows.Forms

MainWindow.xaml

<Window x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        mc:Ignorable="d"
        AllowDrop="true"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel>
            <WindowsFormsHost 
                Background="red" 
                Height="200"
                AllowDrop="true"
                Drop="WindowsFormsHost_Drop">
                <wf:MaskedTextBox Height="200"  x:Name="mtbDate" Mask="00/00/0000"/>
            </WindowsFormsHost>
            <ListBox Name="LogList" />
        </StackPanel>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Windows;

namespace WpfApp3

    public partial class MainWindow : Window
    
        public MainWindow()
        
            InitializeComponent();
            LogList.Items.Add("initialized");
        


        private void WindowsFormsHost_Drop(object sender, DragEventArgs e)
        
            LogList.Items.Add("fileDropped");
            LogList.Items.Add($"FileSource: e.Source");
        
    

谁能告诉我我错过了什么?

【问题讨论】:

&lt;wf:MaskedTextBox x:Name="mtbDate" Mask="00/00/0000" AllowDrop="True" DragEnter="MtbDate_DragEnter" DragDrop="MtbDate_DragDrop"/&gt;。将事件处理程序添加到 WinForms 控件。在MtbDate_DragEnter: e.Effect = System.Windows.Forms.DragDropEffects.Copy; -- 你在WindowsFormsHost_Drop 中的DragEventArgs 应该给你一个模糊引用 异常,因为你需要在那里引用 System.Windows.Forms。 顺便说一句,您可以从WindowsFormsHost 中删除AllowDrop="true" 【参考方案1】:

好吧,我对此进行了一些测试,我只能猜测这是由于 WinForms 和 WPF 不兼容造成的。根据我的研究,当涉及到这些技术时,事件并不总是通过控件进行。

但我可以提出一些解决此限制的建议 - 将事件保留在 WPF 控件中,因此定义不可见的底层控件(它将占据与 WindowsFormsHost 完全相同的区域)以捕获事件:

<Grid>
    <Border
        HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch"
        AllowDrop="True"
        Background="Transparent"
        Drop="WindowsFormsHost_Drop" />
    <WindowsFormsHost
        Name="wfh"
        Height="200"
        Background="red">
        <wf:MaskedTextBox
            x:Name="mtbDate"
            Height="200"
            Mask="00/00/0000" />
    </WindowsFormsHost>
</Grid>

我认为您甚至可以尝试将WindowsFormsHost 中的IsHitTestVisible 设置为false,这样所有的UI 事件都应该失败——但您可以自行测试并决定是否需要。

【讨论】:

非常感谢您的建议,它在我的示例应用程序中确实有效,但我未能将其转换为我的实际项目,因此我还没有将其标记为答案。仍在寻找其他答案

以上是关于WPF 与 WindowsFormsHost 拖放的主要内容,如果未能解决你的问题,请参考以下文章

WPF WindowChrome WindowsFormsHost:不透明度

wpf怎么使用WindowsFormsHost(即winform控件)

从 WindowsFormsHost 中的 Windows 窗体控件获取 WPF 窗口

在 WPF WindowsFormsHost 中滚动 WinForms DataGridView

wpf怎么使用WindowsFormsHost

WPF应用中对WindowsFormHost内容进行裁剪