代码之家  ›  专栏  ›  技术社区  ›  Michael Sorens

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

  •  1
  • Michael Sorens  · 技术社区  · 16 年前

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

    1. 一些拖放操作从源容器中删除拖动的文本, 是否设置为只读 . (感谢马克·摩根在他的 bug report 在我的开源网站上。)
    2. 在不同的应用程序中,文本是保留还是从源容器中删除是不一致的。

    我找不到任何明确的参考,表明拖放行为应该是什么。我最接近的发现在 Windows用户体验交互指南 (对于Vista): “拖放:将对象移动或复制到拖放目标”。当然,这与我的观察结果一致;一些应用程序移动对象,其他应用程序复制对象!

    问题:我想为上面的项目1找到一个解决方法;只读容器不是不可侵犯的,这让我很恼火!作为第二个问题,我想知道是否有人参考了拖放应该如何工作?什么时候搬家,什么时候复印?

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


    1. 从RTB1到RTB2:移动
    2. 从RTB1到其他RTB(外部):移动
    3. 从rtb1到wordpad:复制
    4. 从rtb1到word2003:移动
    5. 从rtb1到outlook2003:复制
    6. 从RTB1到FireFox3.0:复制


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

    8. 从rtb2到wordpad:复制
    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);
            }
        }
    }
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Michael Sorens    16 年前

    由于没有关于这方面的消息,我进一步研究了这个问题。

    首先,我得到了一些 information from Microsoft (通过msdn支持)标准拖放行为 移动 当按住“拖放”控件时, 复制 .

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

    1. 用户可以编辑文本。
    2. 用户可以移动文本(通过拖放)。
    3. 应用程序可以通过编程方式更改文本。

    根据微软,设置 只读的 仅禁用项目(1)!也要荣誉 只读的 对于项目(2),必须手动编码解决方案,而不是使用只读属性。

    对我来说,这显然是一个缺陷。我相信 只读的 应同时禁用(1)和(2)。所以我提交了一份 official defect report Microsoft Connect支持此意见。唉,人们的反应基本上是 “谢谢,但还不够重要。” 叹息…

    推荐文章