在 WPF 文本框中删除文件

Posted

技术标签:

【中文标题】在 WPF 文本框中删除文件【英文标题】:Dropping a file in a WPF TextBox 【发布时间】:2014-09-22 10:53:03 【问题描述】:

我在 Google 和 Stack Overflow 上多次发现这个问题。这些解决方案都不起作用。

我有一个文本框。 AllowDrop 设置为 true。我首先尝试了 DragEnter/DragOver/Drop 事件,然后切换到所有这些事件的“预览”事件。无论我做什么,都不会调用任何事件。接下来我尝试在 InitializeComponent() 之后添加处理程序。没有运气。

Xaml - 已注释掉,因为我无法发布它:

<TextBox PreviewDragEnter="OutputFolder_DragEnter" PreviewDragOver="OutputFolder_DragOver" AllowDrop="True" PreviewDrop="OutputFolder_Drop" />

没有发布 C# 代码,因为没有命中断点。它根本行不通。正如我所提到的,我确实尝试过手动添加处理程序,但仍然无法正常工作。

【问题讨论】:

您的确切代码(据我从您的问题中得知)对我有用。 【参考方案1】:

订阅 PreviewDragHandler 并设置 e.Handled = true。然后 Drop 事件应该触发。

    private void TextBox_PreviewDragOver(object sender, DragEventArgs e)
    
        e.Handled = true;
    

XAML 如下所示,

    <TextBox VerticalAlignment="Center" AllowDrop="True" 
PreviewDragOver="TextBox_PreviewDragOver"/>

【讨论】:

来自 OP - 我已经分配了预览拖动事件。它永远不会击中它。 为了它的价值,我还必须订阅 PreviewDragEnter 事件,否则有一段时间拖动鼠标指针会将其 DragDropEffect 切换为 None。订阅两者并设置 e.Handled = true 使我可以根据需要处理 MainWindow 中的所有放置事件。感谢您的提示!【参考方案2】:

只有在 WPF 应用程序内部开始拖动时才会引发 IIRC 拖动事件。你想要的是 Drop 事件。这段代码对我来说很好。

C#:

private void ListBox_Drop(object sender, DragEventArgs e)

    var fileNames = (string[]) e.Data.GetData(DataFormats.FileDrop);
    if (fileNames == null) return;
    var fileName = fileNames.FirstOrDefault();
    if (fileName == null) return;
    (sender as ListBox).Items.Add(fileName);

xaml:

<ListBox AllowDrop="True" Drop="ListBox_Drop" />

【讨论】:

并没有引发任何事件?你在某处有一个透明的Background 吗?...我刚才遇到了问题。 没有透明背景。只是一个带有网格的窗口和一个文本框。我分配了预览事件,但它们从未受到影响。然后我在代码中手动分配处理程序。将文件从资源管理器拖到文本框中。只看到圆圈/斜线表示没有阻力。 是的……我也只是用TextBox 尝试过……没想到控件会有所作为,但我错了。显然 TextBox 会阻止所有拖放事件。也许这是因为它能够通过拖放复制/粘贴文本…… 我试图写一个DropTextBox(继承自TextBox)然后我覆盖了OnDrop方法,但即使这样也没有被调用。我不知何故认为有人不希望你投递到TextBox。你能放弃其他控件/项目控件还是会破坏你的 UI 设计? 它只是一个显示文件路径的文本框。有一个简单的查找按钮可以启动 OpenDialog。您可以手动输入。允许拖放会很好,我认为我只是做错了什么。其他帖子似乎都可以使用预览使其工作,但该事件不会为我归档。 AddHandler 方法采用布尔值的第三个参数,指示是否应该再次触发已处理的事件。即使这样也不火。也许这是不可能的,但我发现很多人都这么说。【参考方案3】:

发生此问题时,您是否以管理员身份运行 Visual Studio?如果 Windows/UAC 以提升的权限启动(特别是如果您使用的用户帐户不是域的管理员),则 Windows/UAC 通常会阻止来自正在运行的程序外部的拖放操作。

这是我经常遇到的一个问题,在我记得以非管理员身份重新启动 Visual Studio 之前,我可能会遇到很长时间的问题(注意,这个问题适用于 WPF 和 WinForms 项目)。

【讨论】:

【参考方案4】:

7 年后...

在提出这个问题时,我放弃了拖放操作。我无法让它工作。我最终在一个完全不相关的应用程序中需要它,并且再次无法让它工作。在一些谷歌搜索中,我在这里找到了自己的问题。不过终于解决了!

Visual Studio 设置为我以管理员身份运行。这是 IIS 和 Web 应用程序所必需的。但是 Windows 资源管理器不允许在我的资源管理器窗口和我的应用程序之间拖放文件,因为它们在不同的高度/用户权限下运行。如果我单独启动应用程序,它实际上可以工作,并且可能在 7 年前也可以工作。在不调试的情况下启动不是解决方案,因为 Visual Studio 仍会启动它。需要通过双击EXE启动。

【讨论】:

以上是关于在 WPF 文本框中删除文件的主要内容,如果未能解决你的问题,请参考以下文章

VB如何把文件内容显示在文本框中?

WPF文本框,无法编辑文本......即将放弃

怎样删除文件名过长的文件

从SPSS导入时如何从R中的数据框中删除空格

WPF 文本框 RaiseEvent

android中想要对文本框中输入的数据进行保存怎么实现