1つのアプリケーション内のWinFormRichTextBox間、およびそれらと外部アプリケーション間のドラッグアンドドロップをサンプリングすると、2つの興味深い観察結果が明らかになりました(項目1は確かにバグのようです。完璧な世界では、項目2もおそらくバグです)。
- 一部のドラッグアンドドロップ操作では、読み取り専用に設定されているかどうかに関係なく、ドラッグされたテキストがソースコンテナから削除されます。(私のオープンソースサイトのバグレポートでこれに最初に気付いたMark Morganに感謝します。)
- テキストが保持されるか、ソースコンテナから削除されるかは、さまざまなアプリケーション間で一貫性がありません。
ドラッグアンドドロップの動作がどうあるべきかを示す明確なリファレンスが見つかりませんでした。私が見つけた最も近いものは、 Windowsユーザーエクスペリエンスインタラクションガイドライン(Vistaの場合)の476ページにあります:「ドラッグアンドドロップ:オブジェクトはドロップターゲットに移動またはコピーされます」。まあ、それは確かに私の観察と一致しています。オブジェクトを移動するアプリケーションもあれば、コピーするアプリケーションもあります。
質問:上記の項目1の回避策を見つけたいと思います。読み取り専用コンテナが侵害されていないことは私を苛立たせます!二次的な質問として、ドラッグアンドドロップがどのように動作するかについて誰かが言及しているのではないかと思います。いつそれは動きであり、いつそれはコピーですか?
私のサンプルWinFormアプリケーション(以下のコード)には2つのRichTextBoxコントロールが含まれており、左側のコントロールは読み取り専用(これをRTB1と呼びます)で、テキストで初期化されています。右側(RTB2)は読み取り/書き込みであるため、テキストを受信できます。どちらも、テストでドラッグアンドドロップが有効になっています。これが私がテストした組み合わせです。各グループには、少なくとも1つの「奇数マンアウト」があることに注意してください。
- RTB1からRTB2へ:移動
- RTB1から他のRTB(外部)へ:移動
- RTB1からワードパッドへ:コピー
- RTB1からWord2003へ:移動
- RTB1からOutlook2003へ:コピー
RTB1からFirefox3.0へ:コピー
RTB2から他のRTB(外部)へ:移動
- RTB2からワードパッドへ:コピー
- 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);
}
}
}