Glisser-déposer modifie récipient en lecture seule WinForm (ainsi que d'autres particularités de glisser-déplacer)
-
11-09-2019 - |
Question
glisser-déposer d'échantillonnage entre WinForm RichTextBoxes dans l'application et entre eux et les applications externes a révélé deux observations intéressantes (point 1 semble certainement être un bug, dans un monde parfait, le point 2 serait probablement aussi):
- Certaines opérations de glisser-déposer supprimer le texte tiré du conteneur source, si oui ou non il est en lecture seule . (Merci à Mark Morgan pour la première remarquer ceci dans son sur mon site open source.)
- Si le texte est conservé ou supprimé d'un conteneur source est incompatible entre les différentes applications.
Je ne pouvais trouver aucune référence définitive indiquant quel comportement glisser-déposer est censé être. Le plus proche que j'ai trouvé à la page 476 des (pour Vista) de Windows Directives d'interaction expérience utilisateur : « Faire glisser-déposer: l'objet est déplacé ou copié vers la cible de baisse ». Eh bien, qui aligne certainement avec mes observations; certaines applications se déplacent l'objet, d'autres copient!
Les questions: Je voudrais trouver une solution de contournement pour le point 1 ci-dessus; il me contrarie qu'un conteneur en lecture seule n'est pas inviolé! Comme une question secondaire, je me demande si quelqu'un a une référence à la façon dont le glisser-déposer est censé se comporter? Quand est-il un mouvement et quand est-il une copie?
Mon exemple d'application WinForm (code ci-dessous) contient deux contrôles RichTextBox, celui de gauche étant en lecture seule (appeler ce RTB1) et initialisé avec un texte; la droite (RTB2) en cours de lecture / écriture de sorte qu'il peut recevoir des messages texte. Tous les deux ont glisser-déposer activé pour le test. Voici les combinaisons que j'ai testé; remarquer que dans chaque groupe il y a au moins un « homme-out étrange »:
- De RTB1 à RTB2: déplacer
- De RTB1 à d'autres RTB (externe): déplacer
- De RTB1 à WordPad: copie
- De RTB1 à Word2003: déplacer
- De RTB1 à Outlook2003: copie
-
De RTB1 à Firefox3.0: Copier
-
De RTB2 autre RTB (externe): déplacer
- De RTB2 à WordPad: copie
- De RTB2 à Outlook2003: copie
-
De RTB2 à Firefox3.0: Copier
-
De Outlook2003 à RTB2: déplacer
- De WordPad à RTB2: déplacer
- De Word2003 à RTB2: déplacer
- De l'autre RTB (externe) RTB2: déplacer
-
De Firefox3.0 à RTB2: Copier
-
De Word2003 à Outlook2003: Copier
- De Outlook2003 à Word2003: déplacer
Les tests effectués sur Windows XP.
Test app compilé avec .NET 2.0 (a essayé un couple avec .NET 3.5 avec les mêmes résultats).
Voici l'exemple d'application:
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);
}
}
}
La solution
Ayant eu aucun petits morceaux soumis à ce que je plongèrent plus loin dans la question.
Tout d'abord, j'ai obtenu une rapport de défaut officiel à Microsoft Connect qui soutiennent ce point opinion. Hélas, la réponse est revenue essentiellement comme « Merci, mais pas question assez importante pour fixer. » Soupir ...