CSharp WPF TextBox 如何响应鼠标拖拽事件

CSharp WPF TextBox 如何响应鼠标拖拽事件

使用 PreviewDragOver 事件

PreviewDragOver 事件在鼠标指针在 TextBox 控件上移动时触发,可以用来判断是否可以进行拖拽操作。

如果使用 DragOver,是不会触发拖放事件的。

XAML:

1
2
3
4
5
<TextBox
Name="tboxPath"
AllowDrop="True"
PreviewDragOver="UserControl_PreviewDragOver"
PreviewDrop="UserControl_PreviewDrop"/>

C#:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void UserControl_PreviewDragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effects = DragDropEffects.Copy;
}
else
{
e.Effects = DragDropEffects.None;
}
}

private void UserControl_PreviewDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files)
{
// do something with the file
}
}

如果封装在 UserControl 里面

封装在 UserControl 里面,需要在 UserControl_PreviewDragOver 事件中调用 e.Handled = true; 来阻止默认的拖放事件。否则,即使设置了 AllowDrop="True",也不会触发拖放事件。在 UserControl 上设置,还是在 UserControl 内部的控件上设置,均不会触发拖放事件。

XAML 是相同的

C#:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void UserControl_PreviewDragOver(object sender, DragEventArgs e)
{
e.Handled = true; // 阻止默认的拖放事件
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effects = DragDropEffects.Copy;
}
else
{
e.Effects = DragDropEffects.None;
}
}

// 其他代码省略

CSharp WPF TextBox 如何响应鼠标拖拽事件
https://taylorandtony.github.io/2025/03/21/csharp-WPF-TextBox-如何响应鼠标拖拽事件/
作者
TaylorAndTony
发布于
2025年3月21日
许可协议