Элементы управления позиционированием в .Net GroupBox - PullRequest
0 голосов
/ 11 февраля 2011

Обычно я пишу формы с изменяемыми размерами (изящно), используя метод, описанный ниже.

using System.Drawing;
using System.Windows.Forms;
namespace silly
{
    public class Form1 : Form
    {
        private GroupBox g;
        private Button b1, b2;
        public Form1()
        {
            Init();
        }
        private void Init()
        {
            //create and add controls.
            this.Controls.Add(g = new GroupBox());
            g.Controls.AddRange(new Control[] { 
                    b1 = new Button(),
                    b2 = new Button()});


            g.Text = "group";
            b1.Text = "b1";
            b2.Text = "b2!";


            b1.AutoSize = b2.AutoSize = true;


            g.Resize += new System.EventHandler(g_Resize);

        }

        private void g_Resize(object sender, System.EventArgs e)
        {
            b1.Size = b2.Size = new Size(g.ClientSize.Width, g.ClientSize.Height/2);
            b1.Location = Point.Empty;
            b2.Location = new Point(b1.Left, b1.Bottom);
        }
        protected override void OnResize(System.EventArgs e)
        {
            g.Size = this.ClientSize;
            g.Location = Point.Empty;
        }
    }
}

Однако вы быстро заметите, что свойство g.ClientSize не работает, как Form.ClientSizeимущество.То, что я делал, это добавление Point со значениями:

private readonly static Point grp_zero = new Point(10, 20);

, чтобы помочь правильно разместить компоненты.Используя это значение, я могу реорганизовать метод g_Resize с помощью:

b1.Size = b2.Size = new Size(g.ClientSize.Width - grp_zero.X * 2, 
    g.ClientSize.Height/2 - grp_zero.X - grp_zero.Y);
b1.Location = grp_zero;
b2.Location = new Point(b1.Left, b1.Bottom);

с довольно хорошими результатами.Однако, если в конце Init(); найден следующий код:

            g.Font = new Font(g.Font.FontFamily, 28);

или что-то подобное, grp_zero заслуживает изменения размера.

Вопрос

Есть ли хороший обходной путь против этого безумия?Что вы делаете?

Я пробовал Dock и Anchor, но я не могу заставить их заставить кнопки заполнить клиентскую область GroupBox.Эффект, который мне нужен, заключается в том, что каждая кнопка заполняет его половину клиентской области.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 11 февраля 2011

Я пробовал Dock и Anchor, но я не могу заставить их заставить кнопки заполнить клиентскую область GroupBox.Эффект, который мне нужен, заключается в том, что каждая кнопка заполняет его половину клиентской области.

  1. Добавьте TableLayoutPanel к GroupBox
    1. Установите ееСвойство Dock имеет значение Fill
    2. Установите RowCount = 2 и ColumnCount = 1
    3. Установите RowStyles на 50% для каждой строки.Сделано по умолчанию в конструкторе.
  2. Добавьте две свои кнопки к TableLayoutPanel
    1. Установите для их свойств Dock значение Fill
  3. Готово!

Я также предлагаю дать дизайнеру еще один шанс - это действительно очень хорошо!

3 голосов
/ 11 февраля 2011

Если вы все еще хотите использовать код ручной разметки, используйте свойство DisplayRectangle вместо ClientRectangle.Я предпочитаю событие Layout, а не Resize.

private void g_Layout(object sender, System.LayoutEventArgs e)
{
    b1.Size = b2.Size = new Size(g.DisplayRectangle.Width, 
                                 g.DisplayRectangle.Height/2 - 1);

    b1.Location = new Point(g.DisplayRectangle.Left, 
                            g.DisplayRectangle.Top);

    b2.Location = new Point(g.DisplayRectangle.Left, 
                           g.DisplayRectangle.Top + g.DisplayRectangle.Height/2);
}

Обратите внимание, однако, что документация гласит:

Этот API-интерфейс поддерживаетинфраструктура .NET Framework и не предназначена для использования непосредственно из вашего кода.

...