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 повлияет на ваши измерения высоты и ширины.

Другие вопросы по тегам