كيف يمكنني التمرير لوحة الخاص بي باستخدام بلدي عجلة الماوس؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي مجموعة لوحة على شكل لي مع التمرير التلقائي إلى true بحيث يظهر شريط تمرير تلقائيا.

وكيف يمكنني أن أجعل ذلك حتى يمكن للمستخدم استخدام عجلة الماوس للتمرير له لوحة؟ بفضل SO.

هل كانت مفيدة؟

المحلول

ويجب أن يكون لوحة أو عنصر تحكم في لوحة التركيز. لاحظ أنه إذا كان عنصر التحكم مع التركيز ديها أشرطة التمرير، وسوف انتقل بدلا من لوحة.

نصائح أخرى

وماذا عملت بالنسبة لي كان مضيفا panel1_MouseEnter EventHandler:

private void panel1_MouseEnter(object sender, EventArgs e)
{
    panel1.Focus();
}

وفيما يلي الرمز يعمل بالنسبة لي .....

    Public Form
{
InitializeComponent();  
this.MouseWheel += new MouseEventHandler(Panel1_MouseWheel);
}

 private void Panel1_MouseWheel(object sender, MouseEventArgs e)
        {
         panel1.Focus();
         }

في الملف مصمم، يمكنك إضافة السطر التالي من التعليمات البرمجية. لا doumented الحدث عجلة الماوس في قائمة الأحداث في إطار خصائص.

this.Panel1.MouseWheel+= System.Windows.Forms.MouseEventHandler(this.Panel1_MouseWheel);

وسيتم تشغيل Panel1_MouseWheel عند لفة مصيدة للسمك الماوس

وإضافة التعليمات البرمجية في ملف .cs

تأكد من أن لوحة لديه التركيز. وهذا هو رمز بسيط للتمرير التمرير لوحة الخاص بك. نأمل أن تكون هذه المساعدة. :)     أدخل رمز هنا

        if(e.Delta > 0)
        {

            if (pnlContain.VerticalScroll.Value - 2 >= pnlContain.VerticalScroll.Minimum)
                pnlContain.VerticalScroll.Value -= 2;
            else
                pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Minimum;
        }
        else
        {
            if (pnlContain.VerticalScroll.Value + 2 <= pnlContain.VerticalScroll.Minimum)
                pnlContain.VerticalScroll.Value += 2;
            else
                pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Maximum;
        }

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

وماذا فعلت لقد نسيت:

   public myForm()
   {
        InitializeComponent();
        this.DoubleBuffered = true;
   }

وDoubleBuffered السحرية لاحظت ..

وتحريك عجلة التمرير يجب ان يؤدي الحدث MouseMove لعنصر التحكم. حجة MouseEventArgs له خاصية اسمه الدلتا، والتي تعطي (وقعت) عدد من الشقوق أن عجلة الماوس ونقله. يمكنك استخدام هذه الخاصية للتمرير لوحة.

(ورأينا أعلاه) التي يقدمها Beam022 عملت بالنسبة لي حين أن العديد من الحلول الأخرى لم تفعل ذلك. في حالتي، وأنا كان يحاول تمرير عنصر تحكم داتاغريدفيف مع الحدث عجلة الماوس.

وكان يجري استدعاء معالج الحدث DataGridView_MouseWheel لكن قيمة FirstDisplayedScrollingRowIndex يتغير قط. وبلغت القيمة دائما "0" وضع حتى بعد صراحة إلى 1. كما لو كانت تقرأ الممتلكات فقط.

ومع إعدادها في صورة جاهزة في الإطار الصافي 4.6.

في حالتي، احتلت منطقة العميل كاملة من لوحة من UserControls (لا بكسل واحد في المنطقة الداخلية واضحة، باستثناء أشرطة التمرير).

في هذه الحالة لوحة لا يحصل للأحداث الماوس وسوف تركز أبدا (apperently، ثم النقر على شريط التمرير لا يعتبر "يجري داخل لوحة").

وكان لي أن أضيف الأسطر التالية إلى منشئ بلدي UserControl فئة مشتقة:

MouseEnter += delegate {
   Parent?.Focus();
};

والآن فإنه يعمل بشكل جيد، وليس لدي أي محتوى للتمرير في UserControls.

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