1

1つのアプリケーション内のWinFormRichTextBox間、およびそれらと外部アプリケーション間のドラッグアンドドロップをサンプリングすると、2つの興味深い観察結果が明らかになりました(項目1は確かにバグのようです。完璧な世界では、項目2もおそらくバグです)。

  1. 一部のドラッグアンドドロップ操作では、読み取り専用に設定されているかどうかに関係なく、ドラッグされたテキストがソースコンテナから削除されます。(私のオープンソースサイトのバグレポートでこれに最初に気付いたMark Morganに感謝します。)
  2. テキストが保持されるか、ソースコンテナから削除されるかは、さまざまなアプリケーション間で一貫性がありません。

ドラッグアンドドロップの動作がどうあるべきかを示す明確なリファレンスが見つかりませんでした。私が見つけた最も近いものは、 Windowsユーザーエクスペリエンスインタラクションガイドライン(Vistaの場合)の476ページにあります:「ドラッグアンドドロップ:オブジェクトはドロップターゲットに移動またはコピーされます」。まあ、それは確かに私の観察と一致しています。オブジェクトを移動するアプリケーションもあれば、コピーするアプリケーションもあります。

質問:上記の項目1の回避策を見つけたいと思います。読み取り専用コンテナが侵害されていないことは私を苛立たせます!二次的な質問として、ドラッグアンドドロップがどのように動作するかについて誰かが言及しているのではないかと思います。いつそれは動きであり、いつそれはコピーですか?

私のサンプルWinFormアプリケーション(以下のコード)には2つのRichTextBoxコントロールが含まれており、左側のコントロールは読み取り専用(これをRTB1と呼びます)で、テキストで初期化されています。右側(RTB2)は読み取り/書き込みであるため、テキストを受信できます。どちらも、テストでドラッグアンドドロップが有効になっています。これが私がテストした組み合わせです。各グループには、少なくとも1つの「奇数マンアウト」があることに注意してください。


  1. RTB1からRTB2へ:移動
  2. RTB1から他のRTB(外部)へ:移動
  3. RTB1からワードパッドへ:コピー
  4. RTB1からWord2003へ:移動
  5. RTB1からOutlook2003へ:コピー
  6. RTB1からFirefox3.0へ:コピー


  7. RTB2から他のRTB(外部)へ:移動

  8. RTB2からワードパッドへ:コピー
  9. RTB2からOutlook2003へ:コピー
  10. RTB2からFirefox3.0へ:コピー


  11. Outlook2003からRTB2へ:移動

  12. ワードパッドからRTB2へ:移動
  13. Word2003からRTB2へ:移動
  14. 他のRTB(外部)からRTB2へ:移動
  15. Firefox3.0からRTB2へ:コピー


  16. Word2003からOutlook2003へ:コピー

  17. Outlook2003からWord2003へ:移動

テストはWinXPで実行されます。
.NET 2.0でコンパイルされたテストアプリ(同じ結果で.NET 3.5をいくつか試してみました)。


サンプルアプリケーションは次のとおりです。

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);
        }
    }
}
4

1 に答える 1

1

これについての情報が提出されていなかったので、私はこの問題をさらに掘り下げました。

最初に、Microsoftから(MSDNサポートを介して)いくつかの情報を取得しました。ドラッグアンドドロップでコントロールを押したままにすると、標準のドラッグアンドドロップ動作で移動し、コピーを実行します。

次に、次の3つの動作モードについて検討します。

  1. ユーザーはテキストを編集できます。
  2. ユーザーはテキストを移動できます(ドラッグアンドドロップを使用)。
  3. アプリケーションはプログラムでテキストを変更できます。

Microsoftによると、読み取り専用に設定すると、項目(1)のみが無効になります。項目(2)の読み取り専用も尊重するには、読み取り専用プロパティを使用するのではなく、ソリューションを手動でコーディングする必要があります。

まあ、私にとってこれは明らかに欠陥です。読み取り専用では(1)と(2)の両方を無効にする必要があると思います。そこで私は、この意見を支持する公式の欠陥レポートをMicrosoftConnectに提出しました。残念ながら、応答は本質的に「ありがとう、しかし修正するのに十分重要ではない」として返されました。はぁ...

于 2009-08-26T14:38:51.020 に答える