RichTextBox 阻止 DragDrop 事件

RichTextBox blocks DragDrop event

我的 SplitContainer.Panel 上有 DragDropDragEnter 事件:

    splitContainer.Panel.DragDrop += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragDrop);
    splitContainer.Panel.DragEnter += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragEnter);

它与 SplitContainer.Panel 中除 RichTextBox 控件外的每个控件完美配合。

它的样子:

所以 DragDrop/DragEnter 在 SplitContainer 内的每个控件中都能完美工作,除了标记为黄色的控件。

我尝试了什么:

1) 设置

RichTextBox.AllowDrop = false;

所以我什至无法使用 "action is not allowed" 光标使用 DragEnter。

2) 设置

 RichTextBox.AllowDrop = true;

此游标后正常,但它不起作用,因为需要额外的 DragEventHandler 在其他情况下它不起作用。

3) 设置

RichTextBox.EnableAutoDragDrop=false; 
RichTextBox.AllowDrop=true;

与 2) 变体相同的结果。

我不想在 SplitContainer 中为 每个 RichTextBox 设置 DragDrop/DragEnter 事件,因为在 FlowLayoutPanel 中它们是动态创建。

问题是:C#中有没有类似e.PreventDefault模拟的方法?或者除了为每个 RichTextBox 设置事件以使其工作外,我还能做什么?

这对我有用 我创建了 2 个自定义控件

自定义拆分控件

public partial class SplitControlCustom : SplitContainer
    {
        public SplitControlCustom()
        {
            InitializeComponent();
        }

        public void ForceDrageDrop(DragEventArgs eventArgs)
        {
            OnDragDrop(eventArgs);
        }

        public void ForceDragEnter(DragEventArgs eventArgs)
        {
            OnDragEnter(eventArgs);
        }
    }

自定义 RichTextBox

public partial class RichTextBoxCustom : RichTextBox
{
    public RichTextBoxCustom()
    {
        InitializeComponent();
        this.AllowDrop = true;
    }

    protected override void OnDragEnter(DragEventArgs drgevent)
    {
        SplitControlCustom parentSplitControl = Parent.Parent as SplitControlCustom;
        if (parentSplitControl != null)
        {
            parentSplitControl.ForceDragEnter(drgevent);
        }
    }

    protected override void OnDragDrop(DragEventArgs drgevent)
    {

        SplitControlCustom parentSplitControl = Parent.Parent as SplitControlCustom;
        if (parentSplitControl != null)
        {
            parentSplitControl.ForceDrageDrop(drgevent);
        }
    }
}

如果有效请告诉我

我不明白你如何才能直接完成这项工作。但是,既然您已经愿意在生成控件时添加几行代码,为什么不通过几行 Lambda..:[=​​15=] 添加必要的事件呢?

假设您刚刚创建了一个 RichTextBox 并准备将其添加到某个 Controls 集合中..:[=​​15=]

RichTextBox richTextBox = new RichTextBox ();
...
richTextBox.AllowDrop = true;

richTextBox.DragEnter += (ss, ee) => { ee.Effect = DragDropEffects.Copy; };
richTextBox.DragOver += (ss, ee) => { ee.Effect = DragDropEffects.Copy; };
richTextBox.DragDrop += (ss, ee) 
                       => { splitContainer.Panel_DragDrop(splitContainer.Panel, ee); };

前两个lambdas将效果设置为复制而不进行任何检查;当然你会想要添加这些并选择合适的效果。

第三个 lambda 在包含面板的 DragDrop 事件上传递 DragEventArgs,所以现在实时出价实际上是 'D&D-through' ..

只需创建自定义 RichTextBox 并覆盖它的 DragDrop 事件。

public class CustomRichTextBox : RichTextBox
{
    #region Methods

    #region Overrides

    protected override void OnDragEnter(DragEventArgs e)
    {
        // base.OnDragEnter(e);
    }

    protected override void OnDragOver(DragEventArgs e)
    {
        // base.OnDragOver(e);
    }

    protected override void OnDragLeave(DragEventArgs e)
    {
        // base.OnDragLeave(e);
    }

    protected override void OnDrop(DragEventArgs e)
    {
        // base.OnDrop(e);
    }

    #endregion

    #endregion
}

出于某种原因,RichTextBoxes 似乎默认处理所有 DragDrop 事件。 在 WPF 中,事件将传播直到它到达期望这些事件的控件。不过我不确定 WinForms

这就是为我解决了这个问题。

我已经定义了这两个事件,应该已经足够好了

MyRichTextBox.DragEnter += MyRichTextBox_DragEnter;
MyRichTextBox.DragDrop += MyRichTextBox_DragDrop;

我发现在使用嵌入的 RichTextBox 时显然也需要这个 某些控件。

MyRichTextBox.DragOver += MyRichTextBox_DragOver;


private void MyRichTextBox_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}