RichTextBox 阻止 DragDrop 事件
RichTextBox blocks DragDrop event
我的 SplitContainer.Panel
上有 DragDrop
和 DragEnter
事件:
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;
}
我的 SplitContainer.Panel
上有 DragDrop
和 DragEnter
事件:
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;
}