wpf範例 - 如何讓WPF中的控件填充可用空間?




wpf winform差異 (3)

使用Horizo​​ntalAlignmentVerticalAlignment佈局屬性。 它們控制元素在元素使用空間時如何使用其空間內的空間。

例如,一個StackPanel的寬度將與其包含的最寬元素一樣寬。 所以,所有較窄的元素都有一點多餘的空間。 對齊屬性控制子元素對多餘空間的操作。

兩個屬性的默認值是Stretch,所以子元素被拉伸以填充所有可用空間。 其他選項包括水平對齊的左,中和右, 垂直對齊的頂端,中間和底端。

有些WPF控件(如Button )似乎很高興地使用其容器中的所有可用空間,如果您沒有指定它的高度。

還有一些,就像我現在需要使用的那些,(多行) TextBoxListBox似乎更擔心只是為了適應其內容而需要的空間,而沒有更多。

如果你把這些傢伙放在UniformGrid一個單元中,它們將會擴展以適應可用空間。 但是, UniformGrid實例並不適合所有情況。 如果你有一個網格,某些行設置為*高度來劃分其自身與其他*行之間的高度? 如果你有一個StackPanel並且你有一個Label ,一個List和一個Button ,你怎麼能得到這個列表來佔用所有沒有被標籤和按鈕佔用的空間?

我會認為這實際上是一個基本的佈局要求,但我不知道如何讓他們填補他們可能的空間(把它們放在DockPanel並設置它填充也不起作用,看起來,因為DockPanel只佔用其子控件所需的空間。

如果你必須玩HeightWidthMinHeightMinWidth等,可調整大小的GUI將會非常可怕。

你可以將你的HeightWidth屬性綁定到你佔據的網格單元嗎? 還是有另一種方法來做到這一點?


Panel派生的每個控件都實現了在Measure()Arrange()執行的不同佈局邏輯:

  • Measure()確定面板及其每個子項的大小
  • Arrange()確定每個控件呈現的矩形

DockPanel的最後一個孩子填充剩餘的空間。 您可以通過將LastChild屬性設置為false來禁用此行為。

StackPanel詢問每個孩子所需的尺寸,然後堆疊它們。 堆棧面板在每個孩子上調用Measure() ,並使用可用的Infinity大小,然後使用孩子所需的大小。

Grid佔用所有可用空間,但是,它會將每個孩子設置為所需的大小,然後將它們置於單元中。

您可以通過從Panel派生,然後重寫MeasureOverride()ArrangeOverride()來實現自己的佈局邏輯。

看到這篇文章為一個簡單的例子。


那麼,我發現自己,發布後,這是最令人尷尬的方式。 :)

看來StackPanel的每個成員都會填充它的最小請求大小。

在DockPanel中,我以錯誤的順序停靠了東西。 如果文本框或列錶框是唯一沒有對齊的停靠項目,或者它們是最後添加的項目,它們將根據需要填充剩餘空間。

我很想看到處理這個更優雅的方法,但它會。







layout