Winforms 拖放修改只读WinForm容器(以及拖放的其他特性)
对一个应用程序内WinForm RichTextBox之间以及它们与外部应用程序之间的拖放进行采样,发现了两个有趣的观察结果(项目1显然是一个bug;在完美世界中,项目2也可能是):Winforms 拖放修改只读WinForm容器(以及拖放的其他特性),winforms,drag-and-drop,richtextbox,readonly,winforms-interop,Winforms,Drag And Drop,Richtextbox,Readonly,Winforms Interop,对一个应用程序内WinForm RichTextBox之间以及它们与外部应用程序之间的拖放进行采样,发现了两个有趣的观察结果(项目1显然是一个bug;在完美世界中,项目2也可能是): 某些拖放操作会从源容器中删除拖动的文本,无论是否设置为只读。(感谢马克·摩根在我的开源网站上首次注意到这一点。) 在不同的应用程序中,从源容器中保留还是删除文本是不一致的 我找不到任何明确的参考来说明拖放行为应该是什么。我找到的最接近的是Windows用户体验交互指南(适用于Vista)第476页: “拖放:将对象
使用.NET2.0编译的测试应用程序(使用.NET3.5进行了多次尝试,结果相同)
以下是示例应用程序:
using System;
using System.Windows.Forms;
namespace RichTextBoxTest
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
partial class Form1 : Form
{
private RichTextBox richTextBox1 = new RichTextBox();
private RichTextBox richTextBox2 = new RichTextBox();
public Form1()
{
InitializeComponent();
}
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// richTextBox1
//
this.richTextBox1.EnableAutoDragDrop = true;
this.richTextBox1.Location = new System.Drawing.Point(34, 25);
this.richTextBox1.ReadOnly = true;
this.richTextBox1.Size = new System.Drawing.Size(122, 73);
this.richTextBox1.Text = "some stuff here";
//
// richTextBox2
//
this.richTextBox2.EnableAutoDragDrop = true;
this.richTextBox2.Location = new System.Drawing.Point(177, 25);
this.richTextBox2.Size = new System.Drawing.Size(122, 73);
this.richTextBox2.Text = "";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(338, 122);
this.Controls.Add(this.richTextBox2);
this.Controls.Add(this.richTextBox1);
this.Text = "Form1";
this.ResumeLayout(false);
}
}
}
由于没有收到关于这个问题的花边新闻,我进一步深入研究了这个问题 首先,我获得了一些(通过MSDN支持)标准拖放行为执行移动,而使用拖放按住Control键执行复制 接下来,考虑这三种操作模式:
对我来说,这显然是一个缺陷。我认为只读应该禁用(1)和(2)。因此,我向Microsoft Connect提交了一份支持这一观点的报告。唉,回复基本上是“谢谢,但还不足以解决这个问题。”唉…由于没有收到关于这个问题的花絮,我进一步深入研究了这个问题 首先,我获得了一些(通过MSDN支持)标准拖放行为执行移动,而使用拖放按住Control键执行复制 接下来,考虑这三种操作模式:
对我来说,这显然是一个缺陷。我认为只读应该禁用(1)和(2)。因此,我向Microsoft Connect提交了一份支持这一观点的报告。唉,回复基本上是“谢谢,但还不足以解决问题。”唉…谢谢你的信息;有用的东西。谢谢你的信息;有用的东西。