드래그 앤 드롭은 읽기 전용 Winform 컨테이너를 수정합니다 (더욱 드래그 앤 드롭의 다른 특성)

StackOverflow https://stackoverflow.com/questions/1240753

문제

하나의 응용 프로그램 내에서 Winform Richtextbox와 외부 응용 프로그램 사이의 winform Richtextbox 사이의 드래그 앤 드롭을 샘플링하는 두 가지 흥미로운 관찰이 드러났다 (항목 1은 확실히 버그 인 것으로 보이며 완벽한 세계에서는 아마도 항목 2가 아마도있을 것이다).

  1. 일부 드래그 앤 드롭 작업은 소스 컨테이너에서 드래그 된 텍스트를 삭제합니다. 읽기 전용으로 설정되어 있는지 여부. (Mark Morgan에게 감사의 말을 전합니다. 버그 보고서 내 오픈 소스 사이트에서.)
  2. 소스 컨테이너에서 텍스트가 유지되거나 삭제되는지 여부는 다른 응용 프로그램간에 일치하지 않습니다.

드래그 앤 드롭 동작이 무엇인지를 나타내는 결정적인 참조를 찾을 수 없었습니다. 내가 찾은 가장 가까운 것은 Windows 사용자 경험 상호 작용 가이드 라인 (Vista의 경우) : "드래그 앤 드롭 : 물체가 낙하 대상으로 이동하거나 복사됩니다". 글쎄, 그것은 확실히 내 관찰과 일치합니다. 일부 응용 프로그램은 객체를 이동하고 다른 응용 프로그램은 복사합니다!

질문 : 위의 항목 1에 대한 해결 방법을 찾고 싶습니다. 읽기 전용 컨테이너가 침략되지 않는다는 것은 저를 제출합니다! 보조 질문으로, 누군가가 드래그 앤 드롭이 어떻게 행동 해야하는지에 대한 언급이 있는지 궁금합니다. 이동은 언제이며 언제 사본입니까?

내 샘플 winform 응용 프로그램 (아래 코드)에는 2 개의 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. WordPad에서 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);
        }
    }
}
도움이 되었습니까?

해결책

이것에 대해 tidbits를 제출하지 않았기 때문에 나는이 문제에 대해 더 자세히 살았습니다.

먼저, 나는 일부를 얻었습니다 Microsoft의 정보 (MSDN 지원을 통해) 표준 드래그 앤 드롭 동작은 이동하다 드래그 앤 드롭으로 제어를 유지하는 동안 a 복사.

다음 으로이 세 가지 작동 모드를 고려하십시오.

  1. 사용자는 텍스트를 편집 할 수 있습니다.
  2. 사용자는 (드래그 앤 드롭을 통해) 텍스트를 이동할 수 있습니다.
  3. 응용 프로그램은 프로그래밍 방식으로 텍스트를 변경할 수 있습니다.

Microsoft에 따르면 설정에 따르면 읽기 전용 항목 만 비활성화합니다 (1)! 또한 존경합니다 읽기 전용 항목 (2)의 경우 읽기 전용 속성을 사용하지 않고 솔루션을 수동으로 코딩해야합니다.

글쎄, 나에게 이것은 분명히 결함이다. 나는 믿는다 읽기 전용 (1)과 (2)를 모두 비활성화해야합니다. 그래서 나는 제출했다 공식 결함 보고서 Microsoft를 연결 하여이 의견을 뒷받침합니다. 아아, 응답은 본질적으로 돌아 왔습니다 "감사하지만 해결하기에 충분한 문제는 중요하지 않습니다." 한숨을 쉬다...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top