Winforms 拖放修改只读WinForm容器(以及拖放的其他特性)

Winforms 拖放修改只读WinForm容器(以及拖放的其他特性),winforms,drag-and-drop,richtextbox,readonly,winforms-interop,Winforms,Drag And Drop,Richtextbox,Readonly,Winforms Interop,对一个应用程序内WinForm RichTextBox之间以及它们与外部应用程序之间的拖放进行采样,发现了两个有趣的观察结果(项目1显然是一个bug;在完美世界中,项目2也可能是): 某些拖放操作会从源容器中删除拖动的文本,无论是否设置为只读。(感谢马克·摩根在我的开源网站上首次注意到这一点。) 在不同的应用程序中,从源容器中保留还是删除文本是不一致的 我找不到任何明确的参考来说明拖放行为应该是什么。我找到的最接近的是Windows用户体验交互指南(适用于Vista)第476页: “拖放:将对象

对一个应用程序内WinForm RichTextBox之间以及它们与外部应用程序之间的拖放进行采样,发现了两个有趣的观察结果(项目1显然是一个bug;在完美世界中,项目2也可能是):

  • 某些拖放操作会从源容器中删除拖动的文本,无论是否设置为只读。(感谢马克·摩根在我的开源网站上首次注意到这一点。)
  • 在不同的应用程序中,从源容器中保留还是删除文本是不一致的
  • 我找不到任何明确的参考来说明拖放行为应该是什么。我找到的最接近的是Windows用户体验交互指南(适用于Vista)第476页: “拖放:将对象移动或复制到拖放目标”。嗯,这当然符合我的观察结果;一些应用程序移动对象,其他应用程序复制对象

    问题:我想为上述第1项找到一个解决办法;只读容器不是不可侵犯的,这让我很恼火!作为第二个问题,我想知道是否有人提到了拖放的行为方式?什么时候是搬家,什么时候是复制品

    我的示例WinForm应用程序(下面的代码)包含两个RichTextBox控件,左边的一个是只读的(称为RTB1),并用一些文本初始化;右边的一个(RTB2)正在读/写,因此它可以接收文本。两者都为测试启用了拖放功能。以下是我测试的组合;请注意,在每个分组中,至少有一个“单兵出局”:


  • 从RTB1到RTB2:移动
  • 从RTB1到其他RTB(外部):移动
  • 从RTB1到写字板:复制
  • 从RTB1到Word2003:移动
  • 从RTB1到Outlook2003:复制
  • 从RTB1到Firefox3.0:复制


  • 从RTB2到其他RTB(外部):移动

  • 从RTB2到写字板:复制
  • 从RTB2到Outlook2003:复制
  • 从RTB2到Firefox3.0:复制


  • 从Outlook2003到RTB2:移动

  • 从写字板到RTB2:移动
  • 从Word2003到RTB2:移动
  • 从其他RTB(外部)到RTB2:移动
  • 从Firefox3.0到RTB2:复制


  • 从Word2003到Outlook2003:复制

  • 从Outlook2003到Word2003:移动
  • 测试在WinXP上运行。
    使用.NET2.0编译的测试应用程序(使用.NET3.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);
            }
        }
    }
    

    由于没有收到关于这个问题的花边新闻,我进一步深入研究了这个问题

    首先,我获得了一些(通过MSDN支持)标准拖放行为执行移动,而使用拖放按住Control键执行复制

    接下来,考虑这三种操作模式:

  • 用户可以编辑文本
  • 用户可以移动文本(通过拖放)
  • 应用程序可以通过编程方式更改文本
  • 根据微软的说法,设置为只读将只禁用第(1)项!要同时遵守第(2)项的只读
    ,必须手动编码解决方案,而不是使用只读属性


    对我来说,这显然是一个缺陷。我认为只读应该禁用(1)和(2)。因此,我向Microsoft Connect提交了一份支持这一观点的报告。唉,回复基本上是“谢谢,但还不足以解决这个问题。”唉…

    由于没有收到关于这个问题的花絮,我进一步深入研究了这个问题

    首先,我获得了一些(通过MSDN支持)标准拖放行为执行移动,而使用拖放按住Control键执行复制

    接下来,考虑这三种操作模式:

  • 用户可以编辑文本
  • 用户可以移动文本(通过拖放)
  • 应用程序可以通过编程方式更改文本
  • 根据微软的说法,设置为只读将只禁用第(1)项!要同时遵守第(2)项的只读,必须手动编码解决方案,而不是使用只读属性


    对我来说,这显然是一个缺陷。我认为只读应该禁用(1)和(2)。因此,我向Microsoft Connect提交了一份支持这一观点的报告。唉,回复基本上是“谢谢,但还不足以解决问题。”唉…

    谢谢你的信息;有用的东西。谢谢你的信息;有用的东西。