سؤال

أنا أستخدم أ ToolStripDropDown التحكم في تنفيذ الجزء المنسدلة من عنصر تحكم يشبه Combobox المخصص. من أجل أن أكون جذابًا بصريًا ، فأنا أفرض ملف MaximumSize على المنسدلة وتحديد عرض كل يدويًا ToolStripButton داخلها - والنتيجة هي المنبثقة التي هي نفس عرض التحكم الذي ينشطه ، مع غطاء على ارتفاع الجزء المنسدلة.

مثال (مبسط):

ToolStripDropDown dropDown = new ToolStripDropDown();
dropDown.MaximumSize = new Size(200, 100);
dropDown.RenderMode = ToolStripRenderMode.System;
dropDown.AutoSize = true;

for (int i = 0; i < 50; i++) {
    ToolStripButton dropDownItem = (ToolStripButton)dropDown.Items.Add("Item " + i);
    dropDownItem.AutoSize = false;
    dropDownItem.Size = new Size(200, 20);
}

dropDown.Show(owningControl, new Point(0, owningControl.Height - 1));

كما ترون ، يتم تطبيق القيود المفروضة على حجم المنبثقة ، ومع ذلك لا يتم عرض أزرار التمرير لأعلى/لأسفل ويبدو أنه لا توجد طريقة لإظهارها. لا يبدو أن هناك أي طرق أو خصائص في الداخل ToolStripDropDown فيما يتعلق بإزاحة التمرير أو آلية لتمرير عنصر معين في العرض (مثل EnsureVisible() على ListViewItem).

كيف ، إذن ، يمكنني الحصول على القائمة المنسدلة للتمرير؟ ستكون أي طريقة كافية ، سواء كان شريط التمرير أو أزرار التمرير أو حتى عجلة الماوس.

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

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

المحلول

أخيرا تكسير هذا واحد. حدث لي ذلك ContextMenuStrip و ToolStripDropDownMenu قادرون على سلوك التمرير التلقائي الذي فئةهم الأساسية ، ToolStripDropDown, ، لا يمكن توفير. في البداية ، تجنبت هذه الضوابط البديلة لأنها عادة ما تضيف هامشًا واسعًا. يمكن إزالة هذا عبر ShowImageMargin و ShowCheckMargin. حتى بعد القيام بذلك ، يبقى هامش صغير (حوالي 5 بكسل). يمكن إزالة هذا عن طريق تجاوز DefaultPadding منشأه:

public class MyDropDown : ToolStripDropDownMenu {

    protected override Padding DefaultPadding {
        get { return Padding.Empty; }
    }

    public MyDropDown() {
        ShowImageMargin = ShowCheckMargin = false;
        RenderMode = ToolStripRenderMode.System;
        MaximumSize = new Size(200, 150);
    }
}

// adding items and calling Show() remains the same as in the question

ينتج عن هذا نافذة منبثقة يمكن أن تحتوي على أي نوع من عنصر Toolstrip MaximumSize, ، ليس له هامش ، والأهم من ذلك ، لا يسرق التركيز ولا يمكن أن يحصل على التركيز.

نصائح أخرى

هذا هو العدو الخاص بك:

internal virtual bool RequiresScrollButtons
{
    get
    {
        return false;
    }
    set
    {
    }
}

إنه داخلي ، لا يمكنك تجاوزه. يمكنك إحياء نهجك في استخدام نموذج عن طريق إصلاح سلوك سرقة التركيز. الصق هذا في فئة النموذج:

protected override bool ShowWithoutActivation
{
    get { return true; }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top