كيفية التمرير في أداة توصيل ثابتة الحجم
-
27-09-2019 - |
سؤال
أنا أستخدم أ 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; }
}