it-swarm.com.ru

Как изменить размер формы, чтобы она автоматически соответствовала ее содержанию?

Я пытаюсь реализовать следующее поведение:

На форме есть вкладка. На этой вкладке есть древовидная структура. Чтобы предотвратить появление полос прокрутки, я бы хотел, чтобы форма меняла свой размер в соответствии с содержимым древовидной структуры при первом отображении. 

Если в древовидном представлении слишком много узлов, чтобы отобразить его в размере формы по умолчанию, форма должна изменить свой размер, чтобы в древовидной структуре не было вертикальной полосы прокрутки (до максимального размера, разрешенного размером экрана).

Что мне нужно знать, так это то, можно ли добиться такого поведения с помощью свойств элементов управления. Я уверен, что это может быть достигнуто путем расчета и настройки размеров элементов программно, но я хотел бы знать, есть ли способ добиться этого с помощью таких настроек, как AutoSizeMode и т.д.

[Обновление]

Это первый диалог, который видит пользователь моего приложения: это диалог выбора базы данных для работы. Это список баз данных с табуляцией, кнопками и т.д. Если список слишком длинный, появляются полосы прокрутки, и мой коллега хочет, чтобы они исчезли.

28
Inno

Используйте свойства AutoSize и AutoSizeMode.

http://msdn.Microsoft.com/en-us/library/system.windows.forms.form.autosize.aspx

Пример:

private void Form1_Load(object sender, EventArgs e)
{
    // no smaller than design time size
    this.MinimumSize = new System.Drawing.Size(this.Width, this.Height);

    // no larger than screen size
    this.MaximumSize = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, (int)System.Windows.SystemParameters.PrimaryScreenHeight);

    this.AutoSize = true;
    this.AutoSizeMode = AutoSizeMode.GrowAndShrink;

    // rest of your code here...
}
26
Derek Johnson

Используя различные свойства определения размера (Dock, Anchor) или контейнерные элементы управления (Panel, TableLayoutPanel, FlowLayoutPanel и т.д.), Вы можете только определять размер от внешнего элемента управления до внутренних элементов управления. Но в рамках .Net нет ничего (работающего), которое позволяло бы определять размер контейнера через размер дочернего элемента управления. Я также пропустил это несколько раз и попробовал свойство AutoSize, но оно никогда не работало.

Так что все, что вы можете сделать, это попытаться сделать это вручную, извините.

13
Oliver

От MSDN :

Чтобы максимизировать производительность, конструктор Windows Forms затеняет Свойство AutoSize для класса Form. Во время разработки, форма ведет себя так, как будто свойство AutoSize установлено в false, независимо от его фактической настройки. Во время выполнения, никаких специальных размещение производится, и свойство AutoSize применяется как определяется настройкой свойства.

10
serhio

Вы можете рассчитать требуемую высоту TreeView, вычислив высоту узла, умножив ее на количество узлов, а затем соответственно установив свойство MinimumSize формы.

// assuming the treeview is populated!
nodeHeight = treeview1.Nodes[0].Bounds.Height;

this.MaximumSize = new Size(someMaximumWidth, someMaximumHeight);

int requiredFormHeight = (treeView1.GetNodeCount(true) * nodeHeight);

this.MinimumSize = new Size(this.Width, requiredFormHeight);

NB. Это предполагает, однако, что treeview1 является единственным элементом управления в форме. При настройке переменной requiredFormHeight вам нужно будет учесть другие элементы управления и требования к высоте, относящиеся к древовидному представлению, например, упомянутый вами tabcontrol.

(Тем не менее, я согласен с @jgauffin и оценил бы обоснование необходимости изменять размер формы каждый раз, когда она загружается без согласия пользователя - возможно, пусть пользователь размещает и изменяет размер формы и запоминает это вместо этого ??)

5
Stuart Helwig

Это может быть полезно .... Он изменяет размеры новой формы для пользовательского элемента управления, а затем привязывает пользовательский элемент управления к новой форме:

Form f = new Form();
MyUserControl muc = new MyUserControl();
f.ClientSize = muc.Size;
f.Controls.Add(muc);
muc.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
f.ShowDialog();
5
roger the dodger

Если вы пытаетесь подогнать содержание по формам, вам поможет следующее. Это помогает мне, когда я пытался подогнать содержимое формы, чтобы соответствовать размеру формы.

this.contents.Size = new Size (this.ClientRectangle.Width, this.ClientRectangle.Height);

3
Lifestohack

Этот метод решил мою проблему:

В родительской форме:

frmEmployee frm = new frmEmployee();
frm.MdiParent = this;
frm.Dock = DockStyle.Fill;
frm.Show();

В дочерней форме (событие Load):

this.WindowState = FormWindowState.Maximized;
3
Phantom Lord

Я использовал этот код, и он отлично работает

const int margin = 5;
        Rectangle rect = new Rectangle(
            Screen.PrimaryScreen.WorkingArea.X + margin,
            Screen.PrimaryScreen.WorkingArea.Y + margin,
            Screen.PrimaryScreen.WorkingArea.Width - 2 * margin,
            Screen.PrimaryScreen.WorkingArea.Height - 2 * (margin - 7));
        this.Bounds = rect;
0
MBARK T3ST3R