سؤال

بلدي السيناريو التالية:

أنا أعمل على winforms التطبيق في C# الذي يحتوي على زر داخل الصفحة الرئيسية tabcontrol من شأنها أن تولد آخر tabpage في كل مرة يتم النقر فوقه.كل جديد tabpage سوف تحتوي على تخطيط المعرف من قبل المستخدم.

أسئلتي هي:

  1. كيف يمكنني السماح للمستخدم ثم إغلاق واحدة من علامات التبويب التي تم إنشاؤها بشكل حيوي في وقت التشغيل?

  2. كيف يمكن أن أذهب حول تعديل tabcontrol نفسها بحيث صغير 'X' في كل علامة تبويب أن المستخدم قد انقر على من أجل إغلاق هذا الخصوص الحساب ؟ (مثل فايرفوكس)

  3. كيف يمكنني فضح SelectedIndex ممتلكات tabcontrol للمستخدم التحكم إذا كنت ترغب في إغلاق علامة التبويب مع زر داخل عنصر تحكم المستخدم بدلا من ذلك ؟

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

المحلول

أنا خلقت المشتقة من علامة التبويب التحكم عن سنة واحدة.أنا لا أذهب إلى ما بعد المصدر هنا لأنه عن 700 خطوط طويلة مشفرة فوضوي جدا.ربما سوف تجد بعض الوقت لتنظيف الشفرة ثم الإفراج عنها هنا.الآن باختصار سوف تحدد الطريقة التي يتم بناء.

كل علامة تبويب الصفحة الرمز " X " إلى اليسار العنوان صفحات التبويب دعم إعادة ترتيب عن طريق السحب والإفلات و نقلها بين عدة تحكم علامة تبويب.

اخترت الطريق السهل للحصول على أيقونة على صفحات التبويب.تحكم علامة التبويب لديه TabControl.ImageList مكان الإقامة علامة التبويب الصفحة TabPage.ImageIndex مكان الإقامة.لذلك أنا فقط واضاف الرموز الثلاثة إلى صورة قائمة - طبيعي, تحوم, الضغط ومعالجة أحداث الماوس.

مع TabControl.GetTabRect() يمكنك اختبار ما إذا كان الماوس على علامة التبويب صفحات مع بعض الرياضيات تجد إذا كان أكثر من رمز.ثم تحتاج فقط إلى تغيير رمز اعتمادا على زر الماوس الدولة في نهاية المطاف إزالة علامة التبويب الصفحة تحت الماوس إذا تم الضغط على زر.

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

نصائح أخرى

لقد وجدت هذا الكود و كانت مفيدة جدا بالنسبة لي:

private void tabControl_MouseUp(object sender, MouseEventArgs e)
{
    // check if the right mouse button was pressed
    if(e.Button == MouseButtons.Right)
    {
        // iterate through all the tab pages
        for(int i = 0; i < tabControl1.TabCount; i++)
        {
            // get their rectangle area and check if it contains the mouse cursor
            Rectangle r = tabControl1.GetTabRect(i);
            if (r.Contains(e.Location))
            {
                // show the context menu here
                System.Diagnostics.Debug.WriteLine("TabPressed: " + i);
             }
        }
    }
}

TabControl:كيفية التقاط الماوس انقر بزر الماوس الأيمن على علامة التبويب

فعلت التالية:على إنشاء (إضافة) TabPage المرحلة أضفت toolStrip

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;

ثم خلق X زر إضافة إلى toolstrip

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);

إنشاء حدث على النقر على X زر

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

إضافة toolstrip إلى tabpage

tabControl1.TabPages[curenttabpage].Controls.Add(ts);

الآن عن ToolStripButton_Click على النحو التالي:

void ToolStripButton_Click(object sender, EventArgs e)
{ 
 ToolStripButton t = (ToolStripButton)(sender);
 ToolStrip ts = t.Owner;
 TabPage tb = (TabPage)
 (ts.Parent);tabControl1.TabPages.Remove(tb);
}

ربما هو لا كما تريد, ولكن سوف تعمل بشكل جيد.

أنا خلقت الإعداد مماثلة.

كل التحكم التي يتم إضافتها إلى صفحة علامة تبويب في وقت التشغيل مشتق من قاعدة خاصة لمراقبة أنا خلقت.هذه قاعدة التحكم لديه زر إغلاق (جنبا إلى جنب مع بعض الميزات الأخرى مثل آمنة قريبة العلم).

إغلاق علامة التبويب رمز أنا باستخدام بلدي قاعدة التحكم:

 TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;

tabControl.TabPages.Remove(parent);

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

هذا الرمز قد تساعد throgh إغلاق علامة التبويب عناصر تحكم الماوس الأوسط انقر فوق :

            private void tabControl1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button != System.Windows.Forms.MouseButtons.Middle)
                    return;

                for (int i = 0; i < MainTabControl.TabPages.Count; i++)
                {
                    if (this.MainTabControl.GetTabRect(i).Contains(e.Location))
                    {
                        this.MainTabControl.TabPages.RemoveAt(i);
                        return;
                    }
                }
            }

أعماله!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top