2017-08-31 56 views
3

我有一個用於託管WebBrowser控件的WinForm。我想根據瀏覽器加載的文檔大小動態調整窗體大小。Winform在設置Size屬性時不會調整大小

我可以從WebBrowser控件內成功讀取文檔大小,並基於此設置表單大小,但表單根本不會調整大小。

容量調整是化網頁瀏覽器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); 
} 

此事件就好了,果然和他們是正確基於我加載的頁面上檢測到的文檔加載和文件尺寸,但Size從事件處理程序中始終是37x38。下面是在一個斷點調試器的截圖:

enter image description here

我也試圖將像素點,但是這有同樣的結果。大小仍然是37x38。

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。我從默認設置中更改的唯一屬性是TextFormBorderStyle,它設置爲SizableToolWindow

除了新的Size結構之外,我還嘗試單獨設置HeightWidth屬性,結果相同。

MinimumSizeMaximumSize都設置爲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(); 
    } 
} 
+0

愚蠢的問題,但您可以設置'this.Size'而不僅僅是'Size'並確認它仍然失敗。 – johnjps111

+0

如果你不能增加'Size',那可能是由於某處改變了它或者由於MaxSize造成的。 – Sinatr

+0

首先,你試圖將窗口大小設置爲'[37 38]',這是非常小的(考慮到當前的分辨率),並且可以通過'MinimumSize'屬性來「屏蔽」。嘗試首先將'MinimumSize'更改爲'[1 1]',然後再次嘗試設置大小。 –

回答

3

從代碼判斷,一切都應該按照預期工作,但WinForms中有一個叫做pending layout requests的請求更新佈局。這些更改將在UI失效後應用,因此建議在更新關鍵佈局/可視元素之前使用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(); 
} 
0

嘗試使用ScrollRectangle屬性來代替:

ViewWebBrowser.Height = ViewWebBrowser.Document.Body.ScrollRectangle.Height; 
ViewWebBrowser.Width = ViewWebBrowser.Document.Body.ScrollRectangle.Width; 

每評論跟帖,取出碼頭款式:

ViewWebBrowser.Dock = DockStyle.None; 

使用填充將會干擾您的高度和寬度測量。

+0

謝謝,但同樣的結果...它正在閱讀文檔屬性就好了。 – squillman

+0

Re:dock風格。我明白你的意思。這可能會工作得很好,但將SuspendLayout()和ResumeLayout()添加到處理程序的乞討和結尾中就有訣竅。不過謝謝!我很欣賞這些建議。 – squillman

相關問題