Winform не будет изменять размер при установке свойства Size
У меня есть WinForm, который используется для размещения элемента управления WebBrowser. Я хочу динамически изменить размер формы в зависимости от размера документа, загружаемого браузером.
Я могу успешно прочитать размер документа из элемента управления WebBrowser, и я устанавливаю размер формы на основе этого, но форма просто не изменится.
Изменение размера происходит в событии WebBrowsers DocumentCompleted:
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
ViewWebBrowser.Height = ViewWebBrowser.Document.Window.Size.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Window.Size.Width;
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
Это событие срабатывает очень хорошо, документ загружается и размеры документа определяются должным образом, и они корректны в зависимости от загружаемой страницы, но размер всегда составляет 37x38, выходящий из обработчика события. Вот скриншот отладчика в точке останова:
Я также пытался преобразовать пиксели в точки, но это имело тот же результат. Размер был еще 37х38.
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
Graphics g = this.CreateGraphics();
g.PageUnit = GraphicsUnit.Pixel;
ViewWebBrowser.Height = Convert.ToInt32(ViewWebBrowser.Document.Window.Size.Height * 72 / g.DpiY);
ViewWebBrowser.Width = Convert.ToInt32(ViewWebBrowser.Document.Window.Size.Width * 72 / g.DpiX);
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
Элемент управления WebBrowser загружает документ во время Activated
событие:
private void WebBrowserView_Activated(object sender, EventArgs e)
{
ViewWebBrowser.Navigate(URL);
}
URL
является общедоступным строковым свойством, установленным докладчиком. Докладчик не устанавливает никаких размеров в форме.
AutoSize
в форме установлено значение false. Единственные свойства формы, которые я изменил по умолчанию, это Text
а также FormBorderStyle
который установлен в SizableToolWindow
,
В дополнение к новому Size
структура, я также попытался установить Height
а также Width
свойства независимо с тем же результатом.
MinimumSize
а также MaximumSize
оба установлены на 0,0. настройка MinimumSize
до 1,1 ничего не меняет.
DockStyle
на элементе управления WebBrowser установлен на Fill
так что я только устанавливаю Size
на форме.
Почему форма не принимает новый размер?
РЕДАКТИРОВАТЬ:
Вот полный класс формы:
public partial class WebBrowserView : Form, IWebBrowserView
{
public WebBrowserView()
{
InitializeComponent();
}
public string URL { private get; set; }
private void WebBrowserView_Activated(object sender, EventArgs e)
{
ViewWebBrowser.Navigate(URL);
}
private void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var newHeight = ViewWebBrowser.Document.Window.Size.Height;
var newWidth = ViewWebBrowser.Document.Window.Size.Width;
ViewWebBrowser.Height = newHeight;
ViewWebBrowser.Width = newWidth;
this.Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
}
private void WebBrowserView_FormClosing(object sender, FormClosingEventArgs e)
{
ViewWebBrowser.Dispose();
}
}
2 ответа
Судя по коду, все должно работать как задумано но есть что-то под названием pending layout requests
в WinForms
который запрашивает обновление для макета. Эти изменения применяются после аннулирования пользовательского интерфейса, поэтому рекомендуется использовать SuspendLayout
метод перед обновлением важных макетов / визуальных элементов, а затем вызов ResumeLayout
применить эти ожидающие запросы макета.
Чтобы применить эти изменения, просто сделайте:
void ViewWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
SuspendLayout();
ViewWebBrowser.Height = ViewWebBrowser.Document.Window.Size.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Window.Size.Width;
Size = new Size(ViewWebBrowser.Width, ViewWebBrowser.Height);
ResumeLayout();
}
Попробуйте вместо этого использовать свойство ScrollRectangle:
ViewWebBrowser.Height = ViewWebBrowser.Document.Body.ScrollRectangle.Height;
ViewWebBrowser.Width = ViewWebBrowser.Document.Body.ScrollRectangle.Width;
В ветке комментариев удалите стиль Dock:
ViewWebBrowser.Dock = DockStyle.None;
Использование Fill повлияет на ваши измерения высоты и ширины.