في محاولة لإضافة ToolStrip إلى ToolStripPanel جنبا إلى جنب مع ToolStrip القائمة

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

سؤال

وأنا باستخدام صافي 2.0 مع Visual Studio 2005 وأنا أحاول إضافة إلى اثنين من TOOLSTRIPS مختلفة إلى أعلى النموذج بحيث أنها تظهر جنبا إلى جنب. أريد أن يكون مثل وورد 2003، حيث يمكنك إضافة TOOLSTRIPS متعددة لنفس الصف، ويكون لهم تظهر في خط مع بعضها البعض، بدلا من تكريس صف إلى كل toolstrip.

وهكذا أضفت ToolStripPanel وإرساء إلى أعلى النموذج (لم أكن استخدام ToolStripContainer لأنني لا تحتاج الى كل لوحات إضافية، أنا فقط بحاجة إلى واحد في الأعلى). وأضفت على حد سواء TOOLSTRIPS وتعيين خصائص تمتد على خطأ. يمكنني الحصول عليها لتظهر في الإطار مصمم جنبا إلى جنب، ولكن في وقت لToolStripPanel يفصل TOOLSTRIPS ويعطي كل toolstrip الصف مخصصة الخاصة. كما لو أن يزيد في الطين بلة، عندما وقف التصحيح والعودة إلى المصمم، أنا وجدت أن المصمم هو تحريك TOOLSTRIPS إلى الصف الخاص بهم كذلك! أفعل شيئا خطأ هنا؟

ولقد تم غوغلينغ طوال اليوم وجدت بعض المعلومات حول كائن ToolStripPanelRow، ولكن أنا لا أرى وسيلة سهلة لإضافة TOOLSTRIPS لأنها (أي أنه لايوجد طريقة ToolStripPanelRow.Controls.Add أو أي شيء من هذا القبيل )، كل ما لديها خاصية التحكم () التي تقوم بإرجاع صفيف من الكائنات السيطرة، ولم تتح لي الكثير من الحظ في محاولة لإضافة عناصر إلى أن مجموعة. كما أنني وجدت بعض الوثائق على طريقة ToolStripPanel.Join، الذي يبدو أنه ينبغي القيام بهذه المهمة، لذلك حاولت كل الزائدة 3 كنها لا تعمل كما هو معلن. بغض النظر عن ما أقوم به أو الخيارات التي أحاول، فإنه يضيف دائما toolstrip جديدة إلى الجزء العلوي من لوحة في الصف الخاص به ويدفع كل شيء إلى أسفل.

في مصلحة الكشف الكامل وأود أن أحذركم أن لدي ToolStripPanel واحدة من TOOLSTRIPS تضاف إلى شكل baseclass، وأنا أحاول أن إضافة toolstrip أخرى إلى شكل فرعية يرث من النموذج baseclass. كلاهما أعلن ToolStripPanel وToolStrip في شكل baseclass "صديق المحمية"، هذا ما ينبغي أن يكون العمل. كما ذكرت، ونافذة مصمم على شكل فرعية في اسمحوا لي أن تفعل ذلك (على الأقل لبعض الوقت).

وإذا كان أي شخص يمكن أن تساعدني حصول على هذا العمل أو على الأقل إلقاء بعض الضوء على سبب لم يكن، وسأكون ممتنا للغاية.

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

المحلول

وأنا خلق العرف ToolStripPanel كي أتمكن من تفرط في LayoutEngine؛

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomToolStripPanel : ToolStripPanel
  {
    private LayoutEngine _layoutEngine;

    public override LayoutEngine LayoutEngine
    {
      get
      {
        if (_layoutEngine == null) _layoutEngine = new CustomLayoutEngine();
        return _layoutEngine;
      }
    }

    public override Size GetPreferredSize(Size proposedSize)
    {
      Size size = base.GetPreferredSize(proposedSize);

      foreach(Control control in Controls)
      {
        int newHeight = control.Height + control.Margin.Vertical + Padding.Vertical;
        if (newHeight > size.Height) size.Height = newHeight;
      }

      return size;
    }
  }
}

وثم LayoutEngine مخصصة يضع خارجا TOOLSTRIPS؛

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomLayoutEngine : LayoutEngine
  {
    public override bool Layout(object container, LayoutEventArgs layoutEventArgs)
    {
      Control parent = container as Control;

      Rectangle parentDisplayRectangle = parent.DisplayRectangle;

      Control [] source = new Control[parent.Controls.Count];
      parent.Controls.CopyTo(source, 0);

      Point nextControlLocation = parentDisplayRectangle.Location;

      foreach (Control c in source)
      {
        if (!c.Visible) continue;

        nextControlLocation.Offset(c.Margin.Left, c.Margin.Top);
        c.Location = nextControlLocation;

        if (c.AutoSize)
        {
          c.Size = c.GetPreferredSize(parentDisplayRectangle.Size);
        }

        nextControlLocation.Y = parentDisplayRectangle.Y;
        nextControlLocation.X += c.Width + c.Margin.Right + parent.Padding.Horizontal;
      }

      return false;
    }
  }
}

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

وأمله في أن يساعد (أنها تقوم على <لأ href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.layout.layoutengine.aspx" يختلط = "noreferrer" عنوان = "MSDN"> MSDN LayoutEngine مثال أو ثابتة لToolStripPanels)

وWyzfen

نصائح أخرى

وSystem.Windows.Forms.FlowLayoutPanel يمكن القيام بهذه المهمة.

وضعت للتو تسيطر على ToolStrip في ذلك مع الترتيب الصحيح.

واعتقد في حالتك أنت يمكن أن تفلت من مجرد وضع LayoutStyle على ToolStrip لToolStripLayoutStyle.HorizontalStackWithOverflow بدلا من حاجة LayoutEngine المخصصة الخاصة بك.

وسألت مسألة مختلفة على موضوع مماثل حول كيفية التعامل مع تخطيط مع العناصر الحيوية لتحقيق سيطرة أفضل من فيض.

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