在一个应用程序内的winform richtextbox之间以及它们与外部应用程序之间进行拖放采样时,发现了两个有趣的观察结果(项目1显然是一个bug;在完美的世界中,项目2也可能是这样的):
-
一些拖放操作从源容器中删除拖动的文本,
是否设置为只读
. (感谢马克·摩根在他的
bug report
在我的开源网站上。)
-
在不同的应用程序中,文本是保留还是从源容器中删除是不一致的。
我找不到任何明确的参考,表明拖放行为应该是什么。我最接近的发现在
Windows用户体验交互指南
(对于Vista):
“拖放:将对象移动或复制到拖放目标”。当然,这与我的观察结果一致;一些应用程序移动对象,其他应用程序复制对象!
问题:我想为上面的项目1找到一个解决方法;只读容器不是不可侵犯的,这让我很恼火!作为第二个问题,我想知道是否有人参考了拖放应该如何工作?什么时候搬家,什么时候复印?
我的WinForm应用程序示例(下面的代码)包含两个RichTextBox控件,左边的控件是只读的(称为rtb1),并用一些文本初始化;右边的控件(rtb2)是读/写的,因此它可以接收文本。两者都为测试启用了拖放功能。以下是我测试的组合;请注意,在每个分组中,至少有一个“怪人出局”:
-
从RTB1到RTB2:移动
-
从RTB1到其他RTB(外部):移动
-
从rtb1到wordpad:复制
-
从rtb1到word2003:移动
-
从rtb1到outlook2003:复制
-
从RTB1到FireFox3.0:复制
-
从RTB2到其他RTB(外部):移动
-
从rtb2到wordpad:复制
-
从rtb2到outlook2003:复制
-
从RTB2到FireFox3.0:复制
-
从outlook2003到rtb2:移动
-
从写字板到RTB2:移动
-
从Word2003到RTB2:移动
-
从其他RTB(外部)到RTB2:移动
-
从FireFox3.0到RTB2:复制
-
从Word2003到Outlook2003:复制
-
从outlook2003到word2003:移动
测试在WinXP上运行。
用.NET 2.0编译的测试应用程序(用相同的结果尝试了.NET 3.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);
}
}
}