Drag-and-drop изменяет контейнер WinForm только для чтения (плюс другие особенности перетаскивания) - PullRequest
1 голос
/ 06 августа 2009

Сэмплирование методом перетаскивания между WinForm RichTextBox в пределах одного приложения и между ними и внешними приложениями выявило два интересных наблюдения (пункт 1, безусловно, является ошибкой; в идеальном мире пункт 2, вероятно, также будет):

  1. Некоторые операции перетаскивания удаляют перетаскиваемый текст из исходного контейнера независимо от того, установлен он только для чтения . (Спасибо Марку Моргану за то, что впервые заметил это в своем отчете об ошибке на моем сайте с открытым исходным кодом.)
  2. Является ли текст сохраненным или удаленным из исходного контейнера, несовместимо между различными приложениями.

Я не смог найти какой-либо определенной ссылки, указывающей, каким должно быть поведение перетаскивания. Самое близкое, что я нашел, было на странице 476 Руководства по взаимодействию с пользователем для Windows (для Vista): Msgstr "Перетаскивание: объект перемещен или скопирован в целевой объект". Ну, это, безусловно, согласуется с моими наблюдениями; некоторые приложения перемещают объект, другие копируют его!

Вопросы: я хотел бы найти обходной путь для пункта 1 выше; меня раздражает, что контейнер только для чтения не является неприкосновенным! В качестве вторичного вопроса мне интересно, есть ли у кого-то ссылка на то, как должен вести себя перетаскивание? Когда это движение и когда это копия?

Мой пример приложения WinForm (код ниже) содержит два элемента управления RichTextBox, левый из которых предназначен только для чтения (назовите его RTB1) и инициализируется некоторым текстом; правый (RTB2) для чтения / записи, чтобы он мог получать текст. В обоих тестах включено перетаскивание. Вот комбинации, которые я тестировал; обратите внимание, что в каждой группе есть по крайней мере один «нечетный человек»:


  1. От RTB1 к RTB2: переместить
  2. Из RTB1 в другой RTB (внешний): переместить
  3. Из RTB1 в WordPad: копировать
  4. Из RTB1 в Word2003: переместить
  5. Из RTB1 в Outlook2003: копия
  6. Из RTB1 в Firefox3.0: копия


  7. Из RTB2 в другой RTB (внешний): переместить

  8. Из RTB2 в WordPad: копирование
  9. Из RTB2 в Outlook2003: копия
  10. Из RTB2 в Firefox3.0: копия


  11. Из Outlook2003 в RTB2: переместить

  12. Из WordPad в RTB2: переместить
  13. Из Word2003 в RTB2: переместить
  14. Из другого RTB (внешнего) в RTB2: переместить
  15. Из Firefox3.0 в RTB2: копия


  16. Из Word2003 в Outlook2003: копия

  17. Из 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);
        }
    }
}

1 Ответ

1 голос
/ 26 августа 2009

После того, как об этом не было сказано, я углубился в этот вопрос.

Во-первых, я получил от Microsoft некоторую информацию (через поддержку MSDN) о том, что стандартное поведение перетаскивания перемещается , удерживая Control с помощью перетаскивания копия .

Далее рассмотрим следующие три режима работы:

  1. Пользователь может редактировать текст.
  2. Пользователь может перемещать текст (с помощью перетаскивания).
  3. Приложение может программно изменять текст.

Согласно Microsoft, настройка только для чтения отключает только пункт (1)! Чтобы также соблюдать только для чтения для элемента (2), необходимо вручную кодировать решение, а не использовать свойство только для чтения.

Ну, для меня это явно дефект. Я считаю, что только для чтения должно отключить (1) и (2). Поэтому я подал официальный отчет о дефектах в Microsoft Connect, поддерживая это мнение. Увы, ответ вернулся по сути «Спасибо, но не настолько важная проблема, чтобы ее исправить.» Вздох ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...