WPF 与 WindowsFormsHost 拖放
WPF with WindowsFormsHost Drag and Drop
当我从桌面拖动文件时,我很难在 WindowsFormsHost
上进行拖放操作,Drop
事件没有触发。
我创建了一个示例项目来演示:
您需要参考 WindowsFormsIntegration
和 System.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}");
}
}
}
谁能告诉我我错过了什么?
好吧,我测试了一下这个问题,我只能猜测这是由于 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 事件都应该失败 - 但由您决定测试并决定是否需要它。
当我从桌面拖动文件时,我很难在 WindowsFormsHost
上进行拖放操作,Drop
事件没有触发。
我创建了一个示例项目来演示:
您需要参考 WindowsFormsIntegration
和 System.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}");
}
}
}
谁能告诉我我错过了什么?
好吧,我测试了一下这个问题,我只能猜测这是由于 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 事件都应该失败 - 但由您决定测试并决定是否需要它。