在一个应用程序中以及它们与外部应用程序之间的WinForm RichTextBox之间进行拖放显示两个有趣的观察结果(第1项肯定似乎是一个错误;在一个完美的世界中,第2项可能也是如此):< / p>
我找不到任何明确的参考,表明应该是什么拖放行为。我发现的最接近的是 Windows用户体验互动指南(适用于Vista)的第476页: “拖放:将对象移动或复制到放置目标”。嗯,这肯定与我的观察结果一致;一些应用程序移动对象,其他应用程序复制它!
问题:我想找到上面第1项的解决方法;它让我觉得只读容器不是不可侵犯的!作为第二个问题,我想知道是否有人提到了拖放应该如何表现?什么时候移动,什么时候复制?
我的示例WinForm应用程序(下面的代码)包含两个RichTextBox控件,左边一个是只读的(调用此RTB1)并用一些文本初始化;正确的(RTB2)正在读/写,因此它可以接收文本。两者都为测试启用了拖放功能。这是我测试的组合;请注意,在每个分组中至少有一个“奇怪的人”:
从RTB1到Firefox3.0:复制
从RTB2到其他RTB(外部):移动
从RTB2到Firefox3.0:复制
从Outlook2003到RTB2:移动
从Firefox3.0到RTB2:复制
从Word2003到Outlook2003:复制
在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);
}
}
}
答案 0 :(得分:1)
在没有提交花絮的情况下,我进一步研究了这个问题。
首先,我获得了一些information from Microsoft(通过MSDN支持)标准的拖放行为执行移动,同时按住Ctrl并拖放执行复制即可。
接下来,考虑以下三种操作模式:
根据Microsoft的说法,设置只读仅禁用项目(1)!要同时尊重第(2)项的只读,必须手动编写解决方案代码而不是使用只读属性。
嗯,对我而言,这显然是一个缺陷。我相信只读应禁用(1)和(2)。所以我向Microsoft Connect提交了official defect report,支持这一观点。唉,回复的回复基本上是“谢谢,但不足以解决问题。”叹息......