Неправильное поведение Panel на унаследованной форме Windows? - PullRequest
6 голосов
/ 11 февраля 2011

Мне нужен обходной путь для некорректного поведения Panel в унаследованной стандартной форме Windows.У меня есть пара кнопок, которые должны быть привязаны к нижнему правому углу панели, но их расположение меняется таким образом, который я не могу предсказать на унаследованных формах.Я пробовал различные комбинации свойств Dock и Anchor, но пока ничего не заставляет кнопки отображаться там, где они должны.Все элементы управления отмечены как Защищенные.

Поведение является правильным на самой форме base .Неправильное поведение происходит только на унаследованных формах;кнопки не привязаны к родительской панели.

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

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

Что я хочу: панель в нижней части изменяемой формы формы с кнопками в правом нижнем углу.Оставшаяся часть формы должна быть областью с изменяемыми размерами для DataGridView (с этим я уже разобрался с проблемами наследования и закрепления>: - /) Кнопки всегда должны находиться в правом нижнем углу независимо от размера окна.Я не хочу изменять размеры кнопок.

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

Я нашел эту ссылку, которая, по-видимому, описывает подобное неправильное поведение: Каккнопки остановки от перемещения в унаследованном виде .На него не было ответа.


Вот некоторый код, извлеченный из программы, с которой у меня проблема.

Базовая форма

// 
// refreshButton
// 
this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.refreshButton.Location = new System.Drawing.Point(200, 4);
this.refreshButton.Name = "refreshButton";
this.refreshButton.Size = new System.Drawing.Size(75, 23);
this.refreshButton.TabIndex = 5;
this.refreshButton.Text = "&Refresh";
this.refreshButton.UseVisualStyleBackColor = true;
// 
// saveButton
// 
this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.saveButton.Location = new System.Drawing.Point(281, 5);
this.saveButton.Name = "saveButton";
this.saveButton.Size = new System.Drawing.Size(75, 23);
this.saveButton.TabIndex = 4;
this.saveButton.Text = "&Save";
this.saveButton.UseVisualStyleBackColor = true;
// 
// buttonPanel
// 
this.buttonPanel.Controls.Add(this.saveButton);
this.buttonPanel.Controls.Add(this.refreshButton);
this.buttonPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
this.buttonPanel.Location = new System.Drawing.Point(0, 231);
this.buttonPanel.Name = "buttonPanel";
this.buttonPanel.Size = new System.Drawing.Size(360, 31);
this.buttonPanel.TabIndex = 6;

Унаследованная форма (изменена в соответствии с содержимым моих данных)

// 
// refreshButton
// 
this.refreshButton.Location = new System.Drawing.Point(286, 7);
this.refreshButton.TabIndex = 0;
// 
// saveButton
// 
this.saveButton.Location = new System.Drawing.Point(367, 7);
this.saveButton.TabIndex = 1;
// 
// buttonPanel
// 
this.buttonPanel.Location = new System.Drawing.Point(0, 232);
this.buttonPanel.Size = new System.Drawing.Size(445, 33);

Редактировать : некоторые дополнительные данные после игры с ним больше.Проблема заключается в ошибке в конструкторе Visual Studio 2005 или странном взаимодействии между дизайнером и компилятором C #.Когда я создаю свою унаследованную форму, кнопки перемещаются в произвольное (но не случайное!) Место за краем формы.Кнопки по-прежнему доступны и доступны для выбора с помощью раскрывающегося списка элементов управления в окне «Свойства VS».

Я могу выбрать элементы управления и восстановить их расположение, чтобы они отображались в правильном месте на поверхности проектирования и во время выполнения.Они даже двигаются правильно, когда я изменяю размер формы.Однако после сборки дизайнер изменяет расположение кнопок visible .Код в файле * .Designer.cs по-прежнему корректен, но свойства кнопки изменены.В унаследованной форме сверху свойства Location дизайнера для refreshButton и saveButton имеют значение 371,7 и 452,7, хотя ширина рабочей панели составляет всего 445 пикселей.

По крайней мере эта новая информация дает мне частичнуюисправить, но я до сих пор не знаю, почему это происходит.


Ответ: Ну, оказывается, кнопки на самом деле do остаются привязанными к панели,К сожалению, дизайнер меняет расположение якоря так, чтобы оно находилось где-то за пределами видимой области формы.Вывод заключается в том, что конструктор VS2005 ненадежен и не обрабатывает унаследованные формы на 100% правильно.

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

/// <summary>
/// Must handle some layout operations manually because Visual Studio 
/// 2005 arbitrarily changes some properties of inherited controls.
/// </summary>
/// <param name="e">Data for event.</param>
protected override void OnResize(EventArgs e)
{
    base.OnResize(e);

    // Move Refresh and Save buttons to lower right corner of button panel.
    saveButton.Top = buttonPanel.Bounds.Height -
        (saveButton.Height + saveButton.Padding.Bottom + saveButton.Margin.Bottom);
    saveButton.Left = buttonPanel.Bounds.Width -
        (saveButton.Width + saveButton.Padding.Right + saveButton.Margin.Right);
    refreshButton.Top = saveButton.Top;
    refreshButton.Left = saveButton.Left -
        (refreshButton.Width + refreshButton.Padding.Right + refreshButton.Margin.Right);
}

Ответы [ 4 ]

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

Давайте посмотрим некоторый код, который дублирует поведение.Этот код не:

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

class FormBase : Form
{
    public FormBase()
    {
        Panel panel;
        Controls.Add(panel = new Panel { Dock = DockStyle.Bottom, Height = 120, BackColor = Color.LightGray });
        panel.Controls.Add(new Button { Text = "Button 1", Anchor = AnchorStyles.Bottom | AnchorStyles.Right, Location = new Point(panel.ClientSize.Width - 80, panel.ClientSize.Height - 60) });
        panel.Controls.Add(new Button { Text = "Button 2", Anchor = AnchorStyles.Bottom | AnchorStyles.Right, Location = new Point(panel.ClientSize.Width - 80, panel.ClientSize.Height - 30) });
    }
}

class FormInherited : FormBase
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FormInherited());
    }
}
1 голос
/ 19 августа 2011

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

Я обнаружил, что все работает лучше, если вы устанавливаете элементы управления там, где это возможно (вместо привязки), даже если это означает размещение элементов управленияна панелях внутри панелей.(Вы сказали, что работа вокруг, верно?!)

0 голосов
/ 31 января 2015

У меня VS 2012, он даже содержит унаследованные формы, но у меня та же проблема, независимо от того, наследую ли я сам или использую шаблон ... якорь идет не так, и изменение позиции умножается, как если бы яесть только форма, она идет 1px за 1px, если у меня есть панель, она перемещается 2 за 1px, если у меня 2 панель, она перемещается 3 ... я не измерял ее, но похоже, что вот так ...


Kinda An Answer:

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

0 голосов
/ 16 декабря 2014

У меня была такая же проблема с панелями.
Чтобы исправить это, сначала установите свойство привязки в конструкторе родительской формы.
Затем перейдите к BUILD -> REBUILD SOLUTION .

Это также должно работать в старых версиях Visual Studio.

EDIT: Для кнопок вам нужно обработать событие Resize, как предлагали другие ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...