2014-02-21 59 views
1

我很好奇,如果這可以做...我有一個網格,包含多行。由於各種設計原因,我想保持行的高度爲height="Auto"。列表框橫跨網格中的三行。除非我將其高度設置爲特定的(height="70"),否則在添加或刪除項目時,它會動態調整其高度,同時還要調整行的高度,因爲它們設置爲Auto。這是一種正常的行爲,所有事情都應該發揮作用 - 我只是想解決這個問題。控制WPF列表框高度而不設置特定的值,並且將行的高度設置爲自動?

有沒有一種方法可以讓這個列表框在它佔據的行的當前高度內垂直拉伸,而不直接控制行的高度?據我所知,行的高度屬性設置爲Auto會導致它根據其內容展開和收縮,但是我想知道是否可以阻止我的ListBox擁有該權限,同時允許其他項目執行正常的操作。

我可以在ListBox上得到一個相當精確的靜態高度,使整個界面看起來不錯,但是我希望能讓它伸展並佔據指定行的空間,同時保持行的高度爲Auto,其他內容除了那個ListBox。

如果無法做到,有沒有人有我想要完成的建議?

編輯:

基於Sheridan的出色答卷,我能夠達到預期的結果。這是使所有事情都發生的代碼(另請參閱Sheridan的代碼)。

public class SumConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     double sum = 0; 

     foreach (var val in values) 
     { 
      sum += (double)val; 
     } 

     return sum; 
    } 


    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); // Didn't implement this part yet... 
    } 
} 

<Window .... 
     xmlns:c="clr-namespace:DSTG.Converters 
     ....> 

<Window.Resources> 
    <c:HeightSumConverter x:Key="SumConverter"/> 
<Window.Resources> 

<ListBox> 
    <ListBox.Height> 
     <MultiBinding Converter="{StaticResource SumConverter}"> 
      <Binding Path="ActualHeight" ElementName="txtDat1"/> 
      <Binding Path="Margin.Bottom" ElementName="txtDat1"/> 
      <Binding Path="ActualHeight" ElementName="txtDat2"/> 
      <Binding Path="Margin.Bottom" ElementName="txtDat2"/> 
      <Binding Path="ActualHeight" ElementName="txtDat3"/> 
     </MultiBinding> 
    </ListBox.Height> 
</ListBox> 

上面的代碼也佔了兩三個控件的底部邊緣,讓一切都對齊

+0

您是否嘗試過將VerticalAlignment設置爲Stretch? – jugg1es

+0

@ jugg1es我有。同樣的行爲。這是因爲沒有什麼限制ListBox的高度,並且由於其高度=「自動」設置,行正在拉伸。 –

+1

您是否知道該行中的哪個控件具有最大高度?你有沒有嘗試綁定列表框的高度到這個控件的高度? – Athari

回答

2

你應該能夠將數據的ListBox.Height屬性綁定到採取其他控制的ActualHeight同樣的空間:

<ListBox Height="{Binding ActualHeight, ElementName=AnotherControlOfTheRightHeight}" /> 

如果沒有其他控制跨越3行,你可以做一個簡單的IMultiValueConverter返回輸入值和數據綁定的總和幾個控件:

<ListBox> 
    <ListBox.Height> 
     <MultiBinding Converter="{StaticResource SumConverter}"> 
      <Binding Path="ActualHeight" ElementName="Control1" /> 
      <Binding Path="ActualHeight" ElementName="Control2" /> 
      <Binding Path="ActualHeight" ElementName="Control3" /> 
     </MultiBinding> 
    </ListBox.Height> 
</ListBox> 
+0

太棒了!它像一個魅力。我會在我原來的帖子中發佈我的代碼,以便其他人可以看到我做了什麼。非常感謝。 –

+0

我還有一個問題。我如何計算三個控件的保證金高度?由於ListBox跨越accorss行,所以發生輕微錯位,所以它沒有考慮其他三個控件之間的餘量。 –

+1

你當然可以做到這一點,儘管它會爲你做更多的工作。沒有理由不能讓你的'Converter'變得更加複雜......我有一個爲'複雜的UI佈局添加'Size'尺寸的'double'值。所以你可以綁定到控件'Margin'屬性,你的'Converter'必須記住輸入可能是'double''或*'Thickness',在這種情況下,它必須提取'Thickness'的'double'。 – Sheridan