【问题标题】:Wpf: Drag And Drop To A TextboxWpf:拖放到文本框
【发布时间】:2011-05-15 23:24:39
【问题描述】:

我用谷歌搜索了这个问题,人们也回答了类似的问题,但由于某种原因,我什么都做不了。我一定在这里遗漏了一些东西......无论如何,当我运行以下代码时,永远不会调用 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 启用拖放时遇到了一些问题...

【问题讨论】:

    标签: wpf textbox drag-and-drop


    【解决方案1】:

    如果您为 PreviewDragOver 添加处理程序,则设置 e.Handled = true 它应该可以工作。

    无论如何都适合我。

    【讨论】:

    • +1 谢谢,也为我工作过......虽然,它会重置 DragEnter 事件中设置的效果。需要找到一些复杂的方法来处理这个问题。
    【解决方案2】:

    TextBox 似乎已经对 DragAndDrop 进行了一些默认处理。如果您的数据对象是一个字符串,它就可以工作。不处理其他类型,您会获得 Forbidden 鼠标效果,并且永远不会调用 Drop 处理程序。

    您似乎可以在PreviewDragOver 事件处理程序中使用e.Handledtrue 启用自己的处理。

    我在 MSDN 上找不到任何关于此的详细信息,但是 发现http://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF 很有帮助。

    【讨论】:

      【解决方案3】:

      您可能还希望以与 PreviewDragOver 相同的方式处理 PreviewDragEnter,否则它将默认为第一个像素上的禁止鼠标。

      在处理程序中确保 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;
              }
      

      【讨论】:

      • 它有效,我通过设置文本框的文本 = 文件[0] 使文本框的文本成为文件路径
      【解决方案4】:

      最好创建您自己的实现Textbox 的文本框类。然后覆盖 OnDrag-Events 并将 e.handled 设置为 false 或做任何你想做的事情。

      使用不是为最初想要的行为而制作的事件有点肮脏。预览是在提交真正的 DragDrop-Events 之前检查一些东西并有一个很好的 Undo 选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多