Le glisser-déposer d'échantillonnage entre WinForm RichTextBox dans une application et entre eux et des applications externes a révélé deux observations intéressantes (élément 1 certainement semble être un bug, dans un monde parfait, le point 2 serait probablement aussi):Glisser-déposer modifie le conteneur WinForm en lecture seule (plus d'autres particularités de glisser-déposer)
- Certaines opérations de glisser-déposer supprimer le texte tiré du récipient source, si oui ou non il est mis en lecture seule. (Merci à Mark Morgan d'avoir d'abord remarqué ceci dans son bug report sur mon site open-source.)
- Si le texte est conservé ou supprimé d'un conteneur source est incohérent entre différentes applications.
Je n'ai trouvé aucune référence définitive indiquant ce que le comportement glisser-déposer est supposé être. Le plus proche que j'ai trouvé était à la page 476 du Directives d'interaction de l'expérience utilisateur Windows (pour Vista): "Glisser-déposer: l'objet est déplacé ou copié sur la cible de dépôt". Eh bien, cela correspond certainement à mes observations; certaines applications déplacent l'objet, d'autres le copient!
Les questions: Je voudrais trouver une solution de contournement pour le point 1 ci-dessus; ça m'irrite qu'un conteneur en lecture seule ne soit pas inviolable! 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-ce un mouvement et quand est-ce une copie?
Mon exemple d'application WinForm (code ci-dessous) contient deux contrôles RichTextBox, le gauche étant en lecture seule (appelez ce RTB1) et initialisé avec du texte; le droit (RTB2) étant en lecture/écriture, il peut recevoir du texte. Les deux ont glisser-déposer activé pour le test. Voici les combinaisons que j'ai testées; remarquer que dans chaque groupe il y a au moins un "homme-out impair":
- De RTB1 à RTB2: déplacer
- De RTB1 autre RTB (externe): déplacer
- De RTB1 à WordPad: copier
- de RTB1 à Word2003: déplacer
- de RTB1 à Outlook2003: copier
de RTB1 à Firefox3.0: copier
De RTB2 autre RTB (externe): déplacer
- De RTB2 à WordPad: copier
- De RTB2 à Outlook2003: copier
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 d'application compilé avec .NET 2.0 (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);
}
}
}
Merci pour l'info; choses utiles. –