我已经搜索了这个问题,人们已经回答了类似的问题,但由于某种原因,我无法得到任何工作。我一定在这里遗漏了一些东西......无论如何,当我运行以下代码时,永远不会调用TextBox_DragEnter处理程序。但是,如果我将xaml中的TextBox元素更改为TextBlock元素,则会调用它。有没有办法从TextBox元素获得相同的行为?以下代码完全隔离了问题...
MainWindow.xaml:
<Window x:Class="Wpf1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Name="myGrid">
<TextBox AllowDrop="True" PreviewDragEnter="TextBox_DragEnter" PreviewDrop="TextBox_Drop" />
</Grid>
</Window>
MainWindow.xaml.cs:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Collections.ObjectModel;
namespace Wpf1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void TextBox_DragEnter(object sender, DragEventArgs e)
{
e.Effects = DragDropEffects.Copy;
}
private void TextBox_Drop(object sender, DragEventArgs e)
{
}
}
}
非常感谢提前!
安德鲁
修改
为了澄清,我想允许将自定义对象放入文本框中。在文本框的Drop处理程序中,我想将文本框的文本设置为对象中的属性,然后将TextBox的IsReadOnly属性设置为false。我只是在为TextBox拖放时遇到一些麻烦...
答案 0 :(得分:52)
如果为PreviewDragOver添加处理程序,则设置e.Handled = true它应该有效。
无论如何都适合我。
答案 1 :(得分:14)
TextBox
似乎已经对DragAndDrop进行了一些默认处理。如果您的数据对象是String,它就可以正常工作。其他类型没有处理,你得到 Forbidden 鼠标效果,你的Drop处理程序永远不会被调用。
您似乎可以在e.Handled
事件处理程序中使用true
到PreviewDragOver
启用自己的处理。
我在MSDN上找不到任何关于它的细节,但是 发现http://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF非常有帮助。
答案 2 :(得分:5)
您可能还希望以与PreviewDragOver相同的方式处理PreviewDragEnter,否则它将默认为第一个像素上的Forbidden Mouse。
在处理程序中,确保DragEventArgs.Data是您要删除的类型。如果是,请将DragEventsArgs.Effects设置为DragDropEffects.Move或AllowedEffects中的其他内容。如果它不是您要删除的类型,请设置为DragDropEffects.None,以禁用删除。
MVVM Light的XAML:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Drop">
<cmd:EventToCommand Command="{Binding DragDropCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
<i:EventTrigger EventName="PreviewDragOver">
<cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
<i:EventTrigger EventName="PreviewDragEnter">
<cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
ViewModel中的处理程序:
private void ExecutePreviewDragEnterCommand(DragEventArgs drgevent)
{
drgevent.Handled = true;
// Check that the data being dragged is a file
if (drgevent.Data.GetDataPresent(DataFormats.FileDrop))
{
// Get an array with the filenames of the files being dragged
string[] files = (string[])drgevent.Data.GetData(DataFormats.FileDrop);
if ((String.Compare(System.IO.Path.GetExtension(files[0]), ".xls", true) == 0)
&& files.Length == 1)
drgevent.Effects = DragDropEffects.Move;
else
drgevent.Effects = DragDropEffects.None;
}
else
drgevent.Effects = DragDropEffects.None;
}
答案 3 :(得分:0)
更好地创建自己的实现Textbox
的Textbox类。然后覆盖OnDrag-Events并将e.handled
设置为false
或执行任何操作。
使用不是原始通缉行为的事件会有点脏。预览是在提交真正的DragDrop-Events之前检查一些东西并有一个很好的撤销选项。