WPF TextBox:取消放置操作会留下插入标记

Posted

技术标签:

【中文标题】WPF TextBox:取消放置操作会留下插入标记【英文标题】:WPF TextBox: Cancelling drop operation leaves Insertion marker 【发布时间】:2021-12-03 05:07:01 【问题描述】:

我有一个 WPF 应用程序,如果满足某些条件,我想取消对 TextBox 的拖放操作(请参阅下面的 shouldCancelDrop):

示例:

XAML:

   <TextBox PreviewDrop="TextBox_PreviewDrop" />

后面的代码:

    private void TextBox_PreviewDrop(object sender, DragEventArgs e)
    
        //Decision if to cancel to drop
        var shouldCancelDrop = false;
        //if (...) shouldCancelDrop = true;
        
        if (shouldCancelDrop)
        
            e.Handled = true;
            return;
        

        //...
    

问题是:离开 TextBox_PreviewDrop-Handler 与 e.Handled = true 后,“插入标记”总是留在文本框中。它看起来像一个文本光标,但它是浅灰色且不闪烁,请看这里(右边的黑色是文本光标):

.

我如何在取消放置时去掉这个插入标记?

它会一直留在 TextBox 中,直到我完成另一个拖动操作!

所以我正在寻找一些“CancelDropOperationAndRedrawTextBox”-Action...

【问题讨论】:

当 Ctrl + V 键盘粘贴操作中止时,也会出现相同的图形故障。 【参考方案1】:

您可以使用“PreviewDragOver”事件来禁止通过 DragDropEffects.None 放置元素:

private void TextBox_OnPreviewDragOver(object sender, DragEventArgs e)

  //Decision if to cancel to drop
  var shouldCancelDrop = false;
  //if (...) shouldCancelDrop = true;

  if (shouldCancelDrop)
  
    e.Effects = DragDropEffects.None;
    return;
  

  //...    

【讨论】:

我确实将此标记为答案,因为我没有找到其他更好的解决方案来解决我的问题。我尝试像 textBox.InvalidateVisual() 或 textBox.UpdateLayout() 来摆脱这个 fuc**** 插入标记都没有成功。我的主要目的是显示一个工具提示,其中包含用户无法粘贴拖动内容的原因。我现在可以在“shouldCancelDrop”的“TextBox_OnPreviewDragOver”函数中执行此操作。这对我的情况来说已经足够了。谢谢@LuckyyStrike

以上是关于WPF TextBox:取消放置操作会留下插入标记的主要内容,如果未能解决你的问题,请参考以下文章

Altium Designer 常用快捷键与常用操作过程

如何在其可点击区域内居中 WPF 复选框?

浅谈WPF中的PreviewTextInput

将 ErrorTemplate 添加到 WPF 用户控件会禁用 TextBox 输入

浅谈WPF中的PreviewTextInput

如何让WPF中窗体失去焦点后TextBox中的被选中文本仍然保持高亮状态?