Сэмплирование методом перетаскивания между WinForm RichTextBox в пределах одного приложения и между ними и внешними приложениями выявило два интересных наблюдения (пункт 1, безусловно, является ошибкой; в идеальном мире пункт 2, вероятно, также будет):
- Некоторые операции перетаскивания удаляют перетаскиваемый текст из исходного контейнера независимо от того, установлен он только для чтения . (Спасибо Марку Моргану за то, что впервые заметил это в своем отчете об ошибке на моем сайте с открытым исходным кодом.)
- Является ли текст сохраненным или удаленным из исходного контейнера, несовместимо между различными приложениями.
Я не смог найти какой-либо определенной ссылки, указывающей, каким должно быть поведение перетаскивания. Самое близкое, что я нашел, было на странице 476 Руководства по взаимодействию с пользователем для Windows (для Vista):
Msgstr "Перетаскивание: объект перемещен или скопирован в целевой объект". Ну, это, безусловно, согласуется с моими наблюдениями; некоторые приложения перемещают объект, другие копируют его!
Вопросы: я хотел бы найти обходной путь для пункта 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: переместить
- Из WordPad в 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);
}
}
}