Drag-and-drop يعدل حاوية Winform للقراءة فقط (بالإضافة إلى خصوصيات أخرى للسحب والإفلات)

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

سؤال

كشفت أخذ العينات السحب والإفلات بين WinForm RichtextBoxes داخل تطبيق واحد وبينها وبين تطبيقات خارجية عن رصدتين مثيرة للاهتمام (البند 1 يبدو بالتأكيد خطأ؛ في عالم مثالي، ربما يكون العنصر 2 كذلك):

  1. بعض عمليات السحب والإفلاتية حذف النص السحب من حاوية المصدر، أم لا يتم تعيينه للقراءة فقط. وبعد (بفضل مارك مورغان لأول ذكر هذا في بلده تقرير الشوائب على موقعي مفتوح المصدر.)
  2. ما إذا كان النص مرتبطا أو حذفه من حاوية مصدر غير متسقة بين تطبيقات مختلفة.

لم أتمكن من العثور على أي مرجع نهائي يشير إلى أن سلوك السحب والإفلات من المفترض أن يكون. الأقرب الذي وجدته كان في الصفحة 476 من Windows مستخدم الخبرة في إرشادات التفاعل (ل Vista): "السحب والإسقاط: يتم نقل الكائن أو نسخه إلى هدف الإسقاط". حسنا، بالتأكيد محاذاة مع ملاحظاتي؛ بعض التطبيقات تحريك الكائن، والبعض الآخر نسخه!

الأسئلة: أود العثور على حل بديل للبند 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: التحرك

اختبارات تشغيل على ويندوز إكس بي.
اختبار التطبيق مترجم مع .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);
        }
    }
}
هل كانت مفيدة؟

المحلول

لم يكن لديه أي من الحكايات المقدمة على هذا ذهبت في هذه القضية.

أولا، حصلت على بعض المعلومات من مايكروسوفت (عبر دعم MSDN) أن سلوك السحب والإفلات القياسي يفعل نقل أثناء الضغط على السيطرة مع السحب والإفلات يفعل ينسخ.

بعد ذلك، فكر في هذه الأنماط الثلاثة للعملية:

  1. يمكن للمستخدم تحرير النص.
  2. يمكن للمستخدم نقل النص (عبر السحب والإفلات).
  3. يمكن للتطبيق تغيير النص برمجيا.

وفقا ل Microsoft، الإعداد يقرأ فقط تعطيل العنصر فقط (1)! لتكريم أيضا يقرأ فقط بالنسبة للبند (2) يجب على المرء يدويا رمز الحل بدلا من استخدام الخاصية للقراءة فقط.

حسنا، بالنسبة لي هذا بوضوح عيب. أعتقد يقرأ فقط يجب تعطيل كل من (1) و (2). لذلك قدمت تقرير عيب رسمي إلى Microsoft Connect تبني هذا الرأي. للأسف، عاد الرد أساسا "شكرا، ولكن ليس أهم إصدار ما يكفي لإصلاح". تنهد...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top