Мне нужен обходной путь для некорректного поведения 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);
}