2014-09-04 87 views
2

我有一個垂直的WarpPanel,它在運行時用控件填充。控件的類型和數量在運行時確定。它適用於具有固定高度的控件,但根據其內容擴展的控件(例如Listbox)通常會創建一個新列。我不知何故需要強制面板將控件放在最後一列作爲其他固定高度控件,除非列中可用空間小於我們試圖放置的控件的MinHeight。爲控件設置高度或MaxHeight不是一個選項。WrapPanel爲每個動態擴展控件創建一個新列

下圖顯示了該問題。這兩個列表框的寬度是相同的,但不是將它們放在同一列中,而是其中一個列表框以不可見的方式顯示。

取而代之的是我希望得到這個:

enter image description here

有什麼辦法來實現這個未做/使用自定義面板?

代碼:

**Panel:** 
<WrapPanel x:Name="wp" Orientation="Vertical"> 

**Adding controls:** 
private void AddControl(bool isListBox) 
{ 
    if (isListBox) 
    { 
     var lb = new ListBox(); 
     lb.MinHeight = 310; 
     lb.Width = 310;  
     lb.MaxWidth = 310; 
     lb.MinWidth = 310; 

     wp.Children.Add(lb); 
    } 
    else 
    { 
     var cb = new ComboBox(); 
     cb.Width = 310; 
     cb.MaxWidth = 310; 

     wp.Children.Add(cb); 
    } 
} 
+0

您能否包含代碼,知道子控件的對齊屬性的方向和值將會有幫助。 – 2014-09-04 15:03:47

+0

*有沒有任何方法可以在沒有製作/使用自定義面板的情況下實現這個功能?* ...不,不是因爲您的要求非常具體。然而,創建一個自定義的'Panel'比你想象的要容易得多......只有兩種方法可以覆蓋:[如何在WPF中創建自定義佈局面板](http://wpftutorial.net/CustomLayoutPanel.html )。 – Sheridan 2014-09-04 15:39:16

回答

2

這裏的問題是,WrapPanel總是要給ListBox中儘可能多的空間就是了,最多在WrapPanel可用高度。你想要發生的事情更像是一個UniformGrid效果,但只適用於在列中擴展Height元素,並且只要MinHeight約束沒有被違反。這會有點棘手,特別是如果在ListBox元素或具有不同MinHeight約束的其他元素之間有其他固定高度元素。

它可以做計算,但我認爲你需要創建一個自定義面板來獲得這種行爲。基本上,它將像WrapPanel代碼一樣工作,但是當你有可變高度元素(其度量值在包裝維度中返回無限大小的元素)時,它需要查看它們的MinHeight並將它們與固定高度元素累積在同一列中,最終將剩餘的非固定高度除以可變元素的數量,以產生將在編配通道中提供的高度。