Glisser-déposer modifie récipient en lecture seule WinForm (ainsi que d'autres particularités de glisser-déplacer)

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

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):

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


  1. De RTB1 à RTB2: déplacer
  2. De RTB1 à d'autres RTB (externe): déplacer
  3. De RTB1 à WordPad: copie
  4. De RTB1 à Word2003: déplacer
  5. De RTB1 à Outlook2003: copie
  6. De RTB1 à Firefox3.0: Copier


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

  8. De RTB2 à WordPad: copie
  9. De RTB2 à Outlook2003: copie
  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 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);
        }
    }
}
Était-ce utile?

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 ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top