拖放修改只读WinForm容器(加上拖放的其他特性)

时间:2009-08-06 19:05:11

标签: winforms drag-and-drop richtextbox readonly winforms-interop

在一个应用程序中以及它们与外部应用程序之间的WinForm RichTextBox之间进行拖放显示两个有趣的观察结果(第1项肯定似乎是一个错误;在一个完美的世界中,第2项可能也是如此):< / p>

  1. 某些拖放操作会从源容器中删除拖动的文本 ,无论它是否设置为只读 。 (感谢Mark Morgan首先在我的开源网站bug report注意到这一点。)
  2. 文本是否从源容器中保留或删除在不同的应用程序之间是不一致的。
  3. 我找不到任何明确的参考,表明应该是什么拖放行为。我发现的最接近的是 Windows用户体验互动指南(适用于Vista)的第476页: “拖放:将对象移动或复制到放置目标”。嗯,这肯定与我的观察结果一致;一些应用程序移动对象,其他应用程序复制它!

    问题:我想找到上面第1项的解决方法;它让我觉得只读容器不是不可侵犯的!作为第二个问题,我想知道是否有人提到了拖放应该如何表现?什么时候移动,什么时候复制?

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


    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:移动
    18. 在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);
              }
          }
      }
      

1 个答案:

答案 0 :(得分:1)

在没有提交花絮的情况下,我进一步研究了这个问题。

首先,我获得了一些information from Microsoft(通过MSDN支持)标准的拖放行为执行移动,同时按住Ctrl并拖放执行复制即可。

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

  1. 用户可以编辑文字。
  2. 用户可以移动文字(通过拖放)。
  3. 应用程序可以通过编程方式更改文本。
  4. 根据Microsoft的说法,设置只读仅禁用项目(1)!要同时尊重第(2)项的只读,必须手动编写解决方案代码而不是使用只读属性。

    嗯,对我而言,这显然是一个缺陷。我相信只读应禁用(1)和(2)。所以我向Microsoft Connect提交了official defect report,支持这一观点。唉,回复的回复基本上是“谢谢,但不足以解决问题。”叹息......