2013-08-30 28 views
3

在我正在編寫的Windows窗體應用程序的主窗體上,我有一個SplitContainer和一個左右面板。右側面板中的錨點設置在右側(或右側和左側)的控件不會留在我放置在設計器中的位置。定期地,控件將像素向左移(在設計器中,而不是在運行時)。對於左右兩側的控件,控件會縮小,但是對於右側的控件,整個控件向左移動,同時保持相同的大小。有誰知道爲什麼發生這種情況或如何避免它?現在,我唯一能做的就是定期將他們移回去。爲什麼WinForms設計器中的控件會自行調整大小?

注:我的Windows窗體設計器目前設置了LayoutMode = SnapToGrid,對齊網格= true,並且5×5

編輯的網格大小:我設法找到一種方式來重現這個問題最終在Visual Studio 2012中。創建一個新的Windows Forms項目,使用我正在使用的相同設計器設置,並將SplitContainer添加到窗體。讓它停靠填充(或使用錨定到所有邊)。現在,將SplitterDistance設置爲100,將SplitterWidth設置爲5.將一個按鈕添加到SplitPanel的右側,並將其設置爲Bottom和Right。移動按鈕,使其右邊緣與SplitPanel側面齊平,然後關閉並打開窗體。神奇的是,按鈕已經向左移動了一個像素。

這裏是什麼樣子你關閉它(在這種情況下,按鈕的位置是105,175)前: The form set up correctly

這裏是什麼樣子後,關閉並重新打開它(現在按鈕的位置是104,175): The form after being closed and reopened

我希望這個例子能幫助任何人重現這個問題。

+2

我現在已經找到一種方法讓您重現問題,並相應地更新了問題。希望能夠讓我擺脫「不會記錄他們問題的程序員」的境界。 – ahouse101

回答

6

在右側的SplitPanel中添加一個按鈕,並將其設置爲「底部」和「左側」。

不,應該是底部和得到了這樣的攝製。它是由SplitterWidth分配引起的。例如將其設置爲6以使按鈕移動2個像素。

這是由自動佈局計算中不可避免的缺陷造成的,訂單很重要,它與SplitContainer實現的ISupportInitialize接口交互不良。面板的佈局首先被計算,但它仍然具有基於默認SplitterWidth的大小。接下來是SplitContainer,現在它注意到面板太寬而且縮小。其中,因爲按鈕已經固定在右側,導致按鈕的移動量與面板太寬。

這樣的佈局計算順序依賴關係在它的設計方式中是常見的和固有的。對於派生表單與基本表單類具有不同大小的繼承表單類尤其存在問題。控件的位置取決於該尺寸(固定在底部或右側)將會以錯誤的位置結束。

許多可能的解決方法,包括不固定在右邊,不改變默認分割寬度和自己計算按鈕位置。

+0

好吧,這很尷尬,我打錯了最重要的一步(現在已經修復了)。無論如何,這非常合理,謝謝。我認爲我將使用它的解決方案將分隔符寬度保留爲默認值(如果我真的需要,我可以稍後在代碼中更改它,因爲我認爲它會更好,如果它是相同的間隔作爲我的應用程序的其餘部分,其中所有控件相隔5個像素)。 – ahouse101

相關問題