modifica arrastar e soltar só de leitura recipiente WinForm (mais outras peculiaridades de arrastar e largar)

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

Pergunta

Amostragem de arrastar-e-soltar entre RichTextBoxes WinForm dentro de um aplicativo e entre estes e as aplicações externas revelou duas observações interessantes (item 1 certamente parece ser um bug, em um mundo perfeito, o item 2 provavelmente seria bem):

  1. Algumas operações de arrastar-e-soltar excluir o texto arrastado do contêiner de origem, ou não está definido para somente leitura . (graças a Mark Morgan para o primeiro perceber isso em sua relatório de bug no meu site de código aberto.)
  2. text
  3. Se é retido ou excluído de um contêiner de origem é inconsistente entre diferentes aplicações.

Eu não poderia encontrar qualquer referência definitiva indicando o comportamento drag-and-drop é suposto ser. O mais próximo que eu encontrei foi na página 476 do do Windows Orientações User Experience Interação (para Vista): "Arrastar e soltar: O objeto é movido ou copiado para o destino de soltar". Bem, isso certamente se alinha com as minhas observações; algumas aplicações mover o objeto, outros copiá-lo!

As perguntas: Eu gostaria de encontrar uma solução alternativa para o item 1 acima; isso me irrita que um recipiente somente leitura não é inviolável! Como uma questão secundária, eu estou querendo saber se alguém tem uma referência a como drag-and-drop é suposto comportar? Quando é que é um movimento e quando é uma cópia?

Meu aplicativo WinForm amostra (código abaixo) contém dois controles RichTextBox, a esquerda um ser só de leitura (chamar este RTB1) e inicializado com algum texto; a um direito (RTB2) sendo de leitura / gravação para que ele possa receber mensagens de texto. Ambos têm de arrastar-e-soltar habilitado para o teste. Aqui estão as combinações que eu testei; Note que em cada agrupamento, há pelo menos um "odd-man-out":


  1. A partir RTB1 para RTB2: move
  2. A partir RTB1 para outro RTB (externo): move
  3. A partir RTB1 para o WordPad: cópia
  4. A partir RTB1 para Word2003: move
  5. A partir RTB1 para Outlook2003: cópia
  6. De RTB1 para Firefox3.0: cópia


  7. De RTB2 para outro RTB (externo): move

  8. A partir RTB2 para o WordPad: cópia
  9. A partir RTB2 para Outlook2003: cópia
  10. De RTB2 para Firefox3.0: cópia


  11. De Outlook2003 para RTB2: move

  12. A partir WordPad para RTB2: move
  13. Word2003 para RTB2: move
  14. De outro RTB (externo) para RTB2: move
  15. De Firefox3.0 para RTB2: cópia


  16. De Word2003 para Outlook2003: cópia

  17. A partir Outlook2003 para Word2003: movimento

testes executados em WinXP.
Teste aplicativo compilado com .NET 2.0 (tentado um par com .NET 3.5 com os mesmos resultados).


Aqui está o aplicativo de amostra:

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

Solução

Tendo tido nenhum tidbits submetidos a este I mergulhou ainda mais no assunto.

Em primeiro lugar, obtive alguns informações do Microsoft (via MSDN apoio) que o comportamento drag-and-drop padrão faz um movimento , mantendo pressionada a tecla Control com drag-and-drop faz um cópia .

Em seguida, considere estes três modos de operação:

  1. O usuário pode editar texto.
  2. O usuário pode mover texto (via drag-and-drop).
  3. A aplicação pode alterar o texto através de programação.

De acordo com a Microsoft, a configuração read-only desativa único item (1)! Para também honra read-only para item (2) deve-se manualmente o código da solução ao invés de usar a propriedade só de leitura.

Bem, para mim, este é claramente um defeito. Acredito read-only deve desativar ambos (1) e (2). Então eu apresentou um oficial defeito relatório para Microsoft Connect defendendo esta opinião. Infelizmente, a resposta voltou como essencialmente "Obrigado, mas não importante questão suficiente para correção." Sigh ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top