Arrastrar y soltar modifica de sólo lectura recipiente WinForm (además de otras peculiaridades de arrastrar y soltar)

StackOverflow https://stackoverflow.com/questions/1240753

Pregunta

arrastrar y soltar muestreo entre RichTextBoxes WinForm dentro de una aplicación y entre éstos y las aplicaciones externas reveló dos observaciones interesantes (punto 1 ciertamente parece ser un error; en un mundo perfecto, punto 2, probablemente sería así):

  1. Algunas operaciones de arrastrar y soltar Eliminación del texto arrastrado desde el contenedor de la fuente, si es o no se establece en sólo lectura . (Gracias a Mark Morgan por primera darse cuenta de esto en su en mi sitio de código abierto.)
  2. si el texto se conserva o elimina de un contenedor de la fuente es inconsistente entre diferentes aplicaciones.

No pude encontrar ninguna referencia definitiva que indica cuál es el comportamiento de arrastrar y soltar se supone que es. Lo más cercano que encontré fue en la página 476 de la experiencia del usuario Pautas de interacción Windows (para Vista): "Arrastrar y soltar: El objeto se mueve o se copia en el destino de colocación". Bueno, que sin duda se alinea con mis observaciones; algunas aplicaciones se mueven el objeto, otros lo copian!

Las preguntas: Me gustaría encontrar una solución para el punto 1; me molesta que un contenedor de sólo lectura no es inviolable! Como una cuestión secundaria, me pregunto si alguien tiene una referencia a cómo se supone que arrastrar y soltar para comportarse? ¿Cuándo es un movimiento y cuándo es una copia?

Mi aplicación de ejemplo WinForm (código de abajo) contiene dos controles RichTextBox, el de la izquierda siendo de sólo lectura (llamar a este RTB1) e inicializado con un texto; el más adecuado (RTB2) siendo de lectura / escritura por lo que puede recibir mensajes de texto. Ambos tienen de arrastrar y soltar habilitado para la prueba. Aquí son las combinaciones que probé; notar que en cada grupo hay por lo menos un "extraño-hombre-out":


  1. Desde RTB1 a RTB2: mover
  2. Desde RTB1 a otro RTB (externo): mover
  3. Desde RTB1 a WordPad: copia
  4. Desde RTB1 a Word2003: mover
  5. Desde RTB1 a Outlook2003: copia
  6. De RTB1 a Firefox3.0: copia


  7. Desde RTB2 a otro RTB (externo): mover

  8. Desde RTB2 a WordPad: copia
  9. Desde RTB2 a Outlook2003: copia
  10. De RTB2 a Firefox3.0: copia


  11. De Outlook2003 a RTB2: mover

  12. WordPad para RTB2: mover
  13. En Word2003 a RTB2: mover
  14. Desde otro RTB (externo) para RTB2: mover
  15. De Firefox3.0 a RTB2: copia


  16. A partir de Word2003 a Outlook2003: copia

  17. Desde Outlook2003 a Word2003: mover

Las pruebas realizadas en WinXP.
aplicación de prueba compilado con .NET 2.0 (intentó una pareja con .NET 3.5 con los mismos resultados).


Aquí está la aplicación de ejemplo:

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);
        }
    }
}
¿Fue útil?

Solución

No habiendo tenido curiosidades presentadas en este profundicé más en el tema.

En primer lugar, obtuve algunos información de Microsoft (a través de la ayuda de MSDN) que el comportamiento estándar de arrastrar y soltar hace un mover mientras mantiene pulsada la tecla control con un simple arrastrar y soltar hace un copiar .

A continuación, considere estos tres modos de funcionamiento:

  1. El usuario puede editar el texto.
  2. El usuario puede mover texto (a través de arrastrar y soltar).
  3. La aplicación puede cambiar el texto mediante programación.

De acuerdo con Microsoft, el ajuste de de sólo lectura desactiva únicamente el material (1)! También en honor a de sólo lectura para el elemento (2) hay que codificar manualmente la solución en lugar de utilizar la propiedad de sólo lectura.

Bueno, para mí esto es claramente un defecto. Creo de sólo lectura debería desactivar ambos (1) y (2). Así que presenté una rel="nofollow oficial informe de defectos a Microsoft Connect abrazar esta opinión. Por desgracia, la respuesta regresó como esencialmente "Gracias, pero no tema lo suficientemente importante como para arreglar." Sigh ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top