modifica arrastar e soltar só de leitura recipiente WinForm (mais outras peculiaridades de arrastar e largar)
-
11-09-2019 - |
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):
- 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.) text
- 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":
- A partir RTB1 para RTB2: move
- A partir RTB1 para outro RTB (externo): move
- A partir RTB1 para o WordPad: cópia
- A partir RTB1 para Word2003: move
- A partir RTB1 para Outlook2003: cópia
-
De RTB1 para Firefox3.0: cópia
-
De RTB2 para outro RTB (externo): move
- A partir RTB2 para o WordPad: cópia
- A partir RTB2 para Outlook2003: cópia
-
De RTB2 para Firefox3.0: cópia
-
De Outlook2003 para RTB2: move
- A partir WordPad para RTB2: move
- Word2003 para RTB2: move
- De outro RTB (externo) para RTB2: move
-
De Firefox3.0 para RTB2: cópia
-
De Word2003 para Outlook2003: cópia
- 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);
}
}
}
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:
- O usuário pode editar texto.
- O usuário pode mover texto (via drag-and-drop).
- 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 ...