القائمة الرئيسية

الصفحات

ContextMenuStrip | شرح اداة قائمة السياق ContextMenuStrip







ContextMenuStrip | شرح اداة قائمة السياق ContextMenuStrip

ContextMenuStrip | شرح اداة قائمة السياق ContextMenuStrip






ContextMenuStrip Control



يوفر عنصر التحكم ContextMenuStrip وظائف قوائم السياق  و تعرف قائمة السياق أيضًا بالقائمة المنبثقة. تظهر قائمة السياق عند النقر بزر الماوس الأيمن على نموذج أو على عنصر تحكم.

إنشاء قائمة سياق

لإنشاء عنصر تحكم ContextMenuStrip في وقت التصميم ، ما عليك سوى سحب عنصر تحكم ContextMenuStrip وإفلاته من Toolbox إلى نموذج في Visual Studio. بعد سحب وإفلات ContextMenuStrip في نموذج ، تتم إضافة ContextMenuStrip1 إلى النموذج وتبدو بالشكل 1. بمجرد وجود ContextMenuStrip في النموذج ، يمكنك إضافة عناصر القائمة وتعيين خصائصها وأحداثها. إذا لاحظت في الشكل 1 ، فإن العنصر الأول من ContextMenuStrip يحتوي على نص اكتب هنا. يمكنك بالفعل البدء في الكتابة هنا





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






يمكننا أيضًا إنشاء قوائم السياق في وقت التشغيل. على الرغم من أنه يمكنك إنشاء ContextMenuStrip في وقت التشغيل ، فمن المستحسن إنشاء وقت التصميم ثم تعيين الخصائص والأساليب في وقت التشغيل.

الخطوة الأولى لإنشاء ContextMenuStrip ديناميكي هي إنشاء مثيل لفئة ContextMenuStrip. ينشئ مقتطف التعليمات البرمجية التالي كائن تحكم ContextMenuStrip.
            ContextMenuStrip ContextMenuStrip1 = new ContextMenuStrip();

في الخطوة التالية ، يمكنك تعيين خصائص عنصر تحكم ContextMenuStrip. يقوم مقتطف التعليمات البرمجية التالي بتعيين خصائص الخلفية ولون المقدمة والنص والاسم ونوع الخط لـ ContextMenuStrip.
ContextMenuStrip1.BackColor = Color.OrangeRed;

            ContextMenuStrip1.ForeColor = Color.Black;

            ContextMenuStrip1.Text = "File Menu";

            ContextMenuStrip1.Font = new Font("Georgia", 16);

الان نقوم بإضافة عناصر الى قائمة السياق لكي تظهر عند الضغط بزر الماوس الأيمن

ContextMenuStrip1.Items.Add("New");
            ContextMenuStrip1.Items.Add("Open");
            ContextMenuStrip1.Items.Add("Exit");

بمجرد أن يصبح عنصر التحكم ContextMenuStrip جاهزًا بخصائصه ، فإن الخطوة التالية هي إضافة ContextMenuStrip إلى نموذج. للقيام بذلك ، قم أولاً بتعيين خاصية ContextMenuStrip ثم استخدم استدعاء الأسلوب Show لعرض ContextMenuStrip.

يضيف مقتطف التعليمات البرمجية التالي عنصر تحكم ContextMenuStrip إلى النموذج الحالي ويعرضه عند النقر بزر الماوس الأيمن فوق النموذج.
this.ContextMenuStrip = ContextMenuStrip1;

            ContextMenuStrip1.Show();



الان بعد اضافه قائمة السياق للفورم ستظهر عند الضغط بزر الماوس الأيمن على الفورم بهذا الشكل




الان عند ما تقوم بالضغط على أي عنصر من عناصر القائمة لن يحدث شيء لانهو لم يتم برمجة احداث هذه الأداة
 الكود التالي يقوم بإضافة حدث ItemClicked

  ContextMenuStrip1.ItemClicked += new ToolStripItemClickedEventHandler(MYToolStripMenuItem);

بعد ان تقوم بكتابة السطر السابق قم بالضغط على Ctrl+.
واختار Generate Method  لكي يتم توليد الدالة تلقائياً
ستبدو الدالة التي تم إنشائها كالتالي
private void MYToolStripMenuItem(object sender, ToolStripItemClickedEventArgs e)
        {
            throw new NotImplementedException();
        }

الان انت لاتعرف لأي عنصر قمت بعمل دالة الحدث هذه ؟

طبعاً الحدث هذا سوف يكون لجميع العناصر قد تستغرب مما اقصد
سوف نستخدم الخاصية ClickedItem لكي يتم تحديد أي العناصر تم الضغط عليه
تابع الشرح وسوف تفهم اكثر
قم بحذف السطر الموجود بالدالة واكتب الاسطر التاليه

private void MyToolStripMenuItem(object sender, ToolStripItemClickedEventArgs e)
        {
            if (e.ClickedItem.Text=="Open")
            {
                MessageBox.Show("open");
            }
            if (e.ClickedItem.Text == "New")
            {
                MessageBox.Show("new");
            }
            if (e.ClickedItem.Text == "Exit")
            {
                this.Close();
            }
        }

هل استوعبت كيف سيتم تحديد أي العناصر تم الضغط عليه وسوف يتم تنفيذ الشرط المتوافق مع النقرة

ويوجد طريقة أخرى لانشاء عناصر للقائمة
            ToolStripMenuItem item = new ToolStripMenuItem("Delete") { Image =Image.FromFile(@"مسار الصورة"), };

لاحظ في البداية ان العناصر التي نضيفها للقائمة هي عباراة عن كائنات من نوع  ToolStripMenuItem
بهذه الطريقة يمكنك تهيئه جميع خصائص العنصر كيف ما تريد  الكود السابق يقوم بإنشاء عنصر مع إضافة صورة له ولكي تضيف الكائن للقائمة
ContextMenuStrip1.Items.Add(item);
من خلال الطريقة السابقة يمكنك معالجة احداث العناصر منفصله يعني كل عنصر له داله الحدث الخاصة به
شكل اضافة عنصر مع ايقونه 






خصائص أداة ContextMenuStrip


الخصائص Properties

·     الخاصية   AutClose   :
هذه الخاصية من نوع Boolean  قيمتها الافتراضية   true  
تستخدم في ما اذا كنت تريد ان تبقى القائمة مفتوحه دائماً ام لا .
اذا كنت تريد ان تبقى مفتوحه قم بتعيين قيمه الخاصية AutoClose  الى false  .
ولاكن ليس من قائمة الخصائص اذا قمت بتعيين الخاصية هذه الى false  من قائمة الخصائص فإنها لن تظهر القائمة ابداً عند التنفيذ وذلك بسبب انهو يتم اغلاق هذه الأداة عند ما يتم فقد التنشيط .

كي تجعل القائمة تبقى مفتوحه بعد ان تضغط على زر الماوس الأيمن ,
قم بكتابة الكود التالي بداخل دالة الحدث Load  للفورم او دالة الحدث Opening لهذه الأداة .

private void Form4_Load(object sender, EventArgs e)
        {
            this.contextMenuStrip1.AutoClose ^= true;
        }

لاحظ السطر الذي بداخل الدالة الان عند ما تقوم بالتنفيذ بعد ان تقوم بالضغط على زر الماوس الأيمن , سوف تظهر القائمة ولاكن لن تستطيع اغلاقها بعد ذالك.

اما بالنسبة للرمز ^ فهو يعني البوابة المنطقية XOR  ,  ويمكنك استخدام رمز البوابة المنطقية في اكواد أخرى منها الشروط
وايضاً اذا سبق لك وقمت بعمل برنامج note pad  او برنامج محاكي لبرنامج Word
فيوجد ازرار لجعل النص مائل او سميك او مسطر
وكل زر من هذه الازرار يقوم بعمليتين .
عند الضغط على زر جعل الخط مائل سوف يكون الخط مائل وعند الضغط عليه مرة أخرى سوف يقوم بالكتابة بشكل عادي , كذالك بنفس الطريقة لباقي الازرار.

الان سوف نستعرض لك كودين يقوما بجعل الخط مائل احدهما يستخدم الرمز ^ و الاخر بدون الرمز ^ ومن ثم نقوم بمواصله موضوع خصائص ContextMenu.

واعتذر منكم على الاطاله ولاكن يهمني ان تتعرفوا على كل كبيره وصغيره في البرمجة بلغة السي شارب .

الكود الأول بدون الرمز ^ :

  private void btnItalic_Click(object sender, EventArgs e)
        {
            richTextBox1.SelectionFont = (!richTextBox1.SelectionFont.Italic) ? new Font(richTextBox1.SelectionFont, richTextBox1.SelectionFont.Style | FontStyle.Italic) : new Font(richTextBox1.SelectionFont, richTextBox1.SelectionFont.Style & ~FontStyle.Italic);

        }

الكود الثاني باستخدام الرمز ^ :

private void btnItalic_Click(object sender, EventArgs e)
        {
 richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, richTextBox1.SelectionFont.Style ^ FontStyle.Italic);
        }
هل لاحظت الفرق الكبير بين الاكواد السابقة مع ان كلاهما يقوما بنفس العملية ,
ولاكن الكود الثاني اسهل ومختصر من الكود الأول.
 اعتقد وضح سبب الإطالة في موضوع رمز بوابة  XOR


نعود الى موضوعنا


·      الخاصية DropShadowEnabled
خاصية من نوع bool  قيمتها الافتراضية true .

تشير هذه الخاصية إلى ما إذا كان تأثير الظل ثلاثي الأبعاد يظهر عند عرض القائمة ,


·       الخاصية ShowCheckMargin
هذه الخاصية تحدد قيمه تشير إلى ما إذا كانت مساحة علامة الاختيار تظهر على الحافة اليسرى من القائمة.
قيمتها الافتراضية false
بهذا الشكل 
الشكل 1




اذا كانت true
تظهر بهذا الشكل

الشكل 2

النقطة الحمراء كي تفرق بين مساحة الصورة الأولى والثانية,

لذالك عندما تكون هذه الخاصية true  يتم تكبير مساحة الجهة اليسرى للقائمة ,
في هذه الحالة يمكنك إضافة صورة للعنصر في القائمة وايضاً علامة اختيار,
علامة اختيار تعني تحديد علامة صح على العنصر تظهر وتختفي عند الضغط على العنصر.
ولكي تقوم بتفيعل علامة الاختيار تضغط على عنصر من عناصر القائمة وتغير قيمة الخاصية Checked الى true .
ولاكن في حالة كانت الخاصية ShowCheckMargin تساوي false  سوف يتم عمل القائمة كما في الشكل الأول , و خاصية Checked سوف تظهر علامة اختيار في حالة عدم وجود صورة للعنصر اما اذا كان هناك صورة للعنصر لن تعمل الخاصية Checked .

·      الخاصية ShowImageMargin
بنفس فكرة الخاصية السابقة ولاكن تظهر مساحة الصور  لاحظ الشكل الأول من الخاصية السابقة , المساحة المظلله على اليسار هي خاصة بالصور وذلك لان هذه الخاصية قيمتها الافتراضية تساوي true,
اذا غيرت قيمه هذه الخاصية الى false  فانهو لن تظهر مساحة تظع فيها صورة للعنصر او علامة اختيار .

ولاكن في حالة كانت الخاصية ShowCheckMargin تساوي true  و الخاصية ShowImageMargin تساوي false سوف تظهر مساحة كما في الشكل الأول ,
واذا عملت صورة للعنصر في القائمة سوف تظهر الصورة في حالة كانت خاصية Checked تساوي false  اما اذا غيرت قيمتها الى true سوف يتم إخفاء الصور,
وإظهار علامة الاختيار بدل من الصورة.

الخاصيتين السابقتين الخاصات بالقائمة مرتبطات بخاصيتين من عناصر القائمة
هما .
Image
و Checked

·      الخاصية ShowItemToolTips
تقوم بعرض تلميح للعنصر عندما تكون تساوي true  وتكون خاصية ToolTipText للعنصر لاتساوي null  أي غير فارغه .

يظهر التلميح عندما يكون مؤشر الماوس فوق العنصر.


·      الخاصية RenderMode
تقوم هذه الخاصية بتحديد شكل القائمة

لاتحتاج الى شرح مفصل فقط انت قم بتغيير قيمها وستلاحظ الشكل الذي سوف يتم تغييره




ContextMenu Event


الاحداث :



·     الحدث Opening :
يعمل هذا الحدث قبل ما يتم فتح قائمة السياق أي عند ضغط على زر الماوس الأيمن سوف يتم تفعيل هذا الحدث ومن ثم تظهر القائمة

مثال :

سنقوم بفتح دالة الحدث Opening لاداة ContextMenu
الكود :
        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
MessageBox.Show("opening");
        }

الكود السابق سوف يقوم بعرض رسالة messageBox  ومن ثم تظهر القائمة.


·      الحدث Opened :
يحدث هذا الحدث عند ظهور القائمة  , أي في نفس الوقت
مثال :

private void contextMenuStrip1_Opened(object sender, EventArgs e)
        {
           MessageBox.Show("opened");
        }

توضيح للحدثين السابقين

في الكود الأول سوف يقوم بتنفيذ الحدث Opening  ولن تظهر القائمة الا بعد ان تقوم بإغلاق الرسالة

اما الكود الثاني سوف يتم تفعيل الحدث Opened  وظهور القائمة في نفس الوقت



توضيح ! :
عندما اشرح الحدث واجعله يقوم بتنفيذ عمليه في الشرح مثلا الاكواد السابقة
استخدمت messageBox  .
لايعني انهو لانستطيع ان نقوم بعمليه غير  الطباعة انت حرر تقوم بإي عمليه تريد.
 فقط استخدم
messageBox  لكي لا يطول الشرح .


ايضاً يوجد فرق اخر بين الحدثين السابقين وهو ان الحدث opening  يوجد لديه خاصية اسمها Cancel  تقوم هذه الخاصية بإلغاء ظهور القائمة عندما تساوي true  ,

مثال لكيفية استخدامها :

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
            e.Cancel = true;
        }

اما الحدث opened  فلا يوجد لديه خاصية



·      الحدث ItemAdded :
يحدث هذا الحدث عندما يتم إضافة عنصر للقائمة ليس في وقت التصميم وانما عندما يكون البرنامج شغال , (الاحداث لا تتفاعل الا في وقت التشغيل).

مثال :
اضفنا للفورم 2 أدوات تحكم textbox  و Button
لكي نقوم بإضافة عنصر جديد للقائمة .

الكود:
private void button1_Click_1(object sender, EventArgs e)
        {
             ToolStripMenuItem ts = new ToolStripMenuItem();
            if (textBox1.Text != null)
            {
                ts.Text = textBox1.Text;
                contextMenuStrip1.Items.Add(ts);
            }        }

        private void contextMenuStrip1_ItemAdded(object sender, ToolStripItemEventArgs e)
        {
            MessageBox.Show("item Added");
        }



·      الحدث ItemRemoved
يحدث هذا الحدث عندما يتم حذف عنصر من القائمة .

·      الحدث ItemClicked
يحدث عندما يتم الضغط على عنصر من عناصر القائمة.


·      الحدث Closing
يحدث عندما يتم اغلاق القائمة مثلا عند الضغط بزر الماوس الأيمن في الفورم ستظهر القائمة وعند الضغط مرة أخرى بزر الماوس الأيمن او الايسر سوف يعمل الحدث ومن ثم يتم إخفاء الفورم .



·      الحدث Closed
هذا الحدث يعمل عندما يتم اغلاق القائمة في نفس الوقت أي ان هذا الحدث عكس الحدث Opend  والحدث Closing  عكس الحدث Openig




هل اعجبك الموضوع :

تعليقات