拖修改只读WinForm容器(及其他特殊性drag-and-drop)
-
11-09-2019 - |
题
抽样的拖放之间的WinForm个richtextboxes内的一个应用程序和它们之间的和外部应用程序揭示了两个有趣的意见(项目1的肯定似乎是一个错误;在一个完美的世界中,项目2可能会以及):
- 一些拖操作的删除的拖文本从源的容器, 它是否设置只读的.(由于马克*摩根对于第一次注意到这在他的 错误的报告 在我的开放源码网站。)
- 文本是否是保留或删除从一个来源的容器是不一致之间的不同应用。
我找不到任何明确的参考指示什么样的拖下的行为应该是。最近,我发现是在476页的 Windows用户的经验相互作用的准则 (Vista):"拖:对象是移动或复制的下降目标"。嗯,这肯定符合我的意见;一些应用程序移动的对象,其副本!
问题:我想找到一个解决办法用于项目1以上;它厌烦我,一个只读容器不是不容侵犯的!作为一个次要的问题,我想知道如果有人有一个参考如何拖是应该的行为?当它是个移动和当是它的一个副本吗?
我的样本WinForm应用程序(代码下文)中包含两个是控制,左边一个只读(称这RTB1)和初始化的一些文字;本权利之一(RTB2)正在读写,所以它可以接受的文本。两个都拖下启用了试验。这里的组合我测试;请注意,在每个分组的至少有一个"奇怪的人-出":
- 从RTB1到RTB2:移动
- 从RTB1其它B(外):移动
- 从RTB1来写字板:复制
- 从RTB1到Word2003:移动
- 从RTB1到Outlook2003:复制
从RTB1到Firefox3.0:复制
从RTB2其它B(外):移动
- 从RTB2来写字板:复制
- 从RTB2到Outlook2003:复制
从RTB2到Firefox3.0:复制
从Outlook2003到RTB2:移动
- 从写字板RTB2:移动
- 从Word2003到RTB2:移动
- 其他B(外部)以RTB2:移动
从Firefox3.0到RTB2:复制
从Word2003到Outlook2003:复制
- 从Outlook2003到Word2003:移动
测试运行在WinXP.
测试的应用程序的汇编。网2.0(尝试了几个与。净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);
}
}
}
解决方案
有没有花絮提交的关于这一点,我探讨了进一步的问题。
第一,我得到一些 信息从Microsoft (通过MSDN支持)这一标准的拖放行为不会 移动 同时按控制与拖不会 复制.
接下来,考虑这三种操作模式:
- 用户可以编辑的文本。
- 用户可移动文本(通过drag-and-drop).
- 应用程序可以改变文本的编程方式。
根据Microsoft,设置 只读的 禁止唯一的项目(1)!还荣誉 只读的 项目(2)一个人必须手动代码的解决方案,而不是使用的只读财产。
嗯,对我来说这是一个明显的缺陷。我相信 只读的 应该禁用(1)和(2)。因此,我提交了 官方的缺陷的报告 Microsoft连接支持这个意见。可惜,响应回来为本质上 "谢谢,但是不足够重要的问题来解决。" 叹...