1

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)

  1. 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.)
  2. 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":


  1. De RTB1 à RTB2: déplacer
  2. De RTB1 autre RTB (externe): déplacer
  3. De RTB1 à WordPad: copier
  4. de RTB1 à Word2003: déplacer
  5. de RTB1 à Outlook2003: copier
  6. de RTB1 à Firefox3.0: copier


  7. De RTB2 autre RTB (externe): déplacer

  8. De RTB2 à WordPad: copier
  9. De RTB2 à Outlook2003: copier
  10. De RTB2 à Firefox3.0: copier


  11. De Outlook2003 à RTB2: déplacer

  12. De WordPad à RTB2: déplacer
  13. De Word2003 à RTB2: déplacer
  14. De l'autre RTB (externe) à RTB2: déplacer
  15. de Firefox3.0 à RTB2: copier


  16. De Word2003 à Outlook2003: copier

  17. 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); 
     } 
    } 
} 

Répondre

1

Ayant eu aucun petits morceaux soumis à ce que je fouillais plus loin dans la question.

D'abord, j'ai obtenu une information from Microsoft (via le support MSDN) que le comportement glisser-déposer la norme fait un mouvement tout en maintenant le contrôle par glisser-déposer une copie ne .

Ensuite, tenir compte de ces trois modes de fonctionnement:

  1. L'utilisateur peut modifier le texte.
  2. L'utilisateur peut déplacer du texte (par glisser-déposer).
  3. L'application peut modifier le texte par programme.

Selon Microsoft, le paramètre en lecture seule désactive uniquement l'élément (1)! Pour honorer également en lecture seule pour l'élément (2), il faut coder manuellement la solution plutôt que d'utiliser la propriété en lecture seule.

Eh bien, pour moi, c'est clairement un défaut. Je crois en lecture seule devrait désactiver à la fois (1) et (2). J'ai donc soumis un official defect report à Microsoft Connect en partageant cette opinion. Hélas, la réponse est revenue comme essentiellement "Merci, mais pas assez important problème à résoudre." Soupir ...

+0

Merci pour l'info; choses utiles. –