2014-01-07 30 views
0

我有一個窗口按網格分割(左中右側),其中中央控件我想要多個控件,它們需要儘可能高地填充它們的高度,同時將其均勻地分開控制。XAML在控件之間劃分高度

的一種方式,我能夠實現這一目標是通過像這樣的網格:

<!-- Center --> 
<Grid Grid.Row="0" Grid.Column="2" Height="Auto"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 

    </Grid.RowDefinitions> 

    <WebBrowser Grid.Row="0" Name="browsc" /> 
    <WebBrowser Grid.Row="1" Name="browsa" /> 
    <WebBrowser Grid.Row="2" Name="browsb" /> 
</Grid> 

這工作,但我需要動態地添加和刪除行,其中有可能在中間一排需要被刪除(導致需要重新排序每個控件所依賴的行,我無法想象一個簡單的解決方案)。

如果沒有更好的方法來拆分控件而不是這樣,我將如何通過代碼(C#)添加和刪除行?

如果有更好的方法來做到這一點,我怎麼能做到這一點,我必須擔心的是添加和刪除控件本身,而不是混亂行屬性?

謝謝!

+1

你需要多大的動力?如果您只需要選擇隱藏中間行,則可以將其內容的可見性設置爲「摺疊」。如果您需要支持任意數量的行,那麼這將不起作用 –

+0

如果我將中間行的可見性設置爲摺疊狀態,它只會在中間形成一個不可見間距,因爲仍然應該有一行。但我最終會想要支持任意數量的行。取決於用戶選擇多少和他們的屏幕大小(最終他們甚至不能查看每個中顯示的數據),從2到5或6。 – dab

+0

爲什麼不使用'StackPanel',它會在添加或刪除UI元素時自動調整? –

回答

1

這似乎是一個很好的例子爲UniformGrid

<UniformGrid Grid.Row="0" Grid.Column="2" Columns="1"> 
    <WebBrowser Name="browsc" /> 
    <WebBrowser Name="browsa" /> 
    <WebBrowser Name="browsb" /> 
</UniformGrid> 

UniformGrid確保所有項目具有相同的大小,寬度和高度。在你的情況下,你只想限制高度,但由於只有一列,所有項目必須有相同的寬度,所以這沒關係。

而不是設置行,我們可以在UniformGrid上設置Columns="1",它會自動安排每個項目在一個新行上。如果您添加或移除項目,或在VisibleCollapsed之間切換Visibility,則會調整所有尺寸以適合空間。

+0

完美!我知道必須有一個簡單的方法來做到這一點。感謝您將此控件引入我的注意! – dab

2

這是一個關於如何添加新RowDefinitionGrid編程和設置控制到一個特定的Grid Row一個例子:

//following line equal to XAML : <RowDefinition Height="*" /> 
var newrow = new RowDefinition {Height = new GridLength(1, GridUnitType.Star)}; 
//add new rowdefinition to grid 
myGridName.RowDefinitions.Add(newrow); 
//set webbrowser control to newly added row, or any row number you wish 
Grid.SetRow(browsx, myGridName.RowDefinitions.Count-1); 

您可以在任何RowDefinitionmyGridName.RowDefinitions屬性訪問之後將其刪除。但更好的主意是將RowDefinition's Height設置爲零而不是將其刪除。因此,您不必重新排列其他控件,例如將第3行中的控件移至第2行,因爲之前的第2行已被刪除。

+0

好吧,我看到,以這種方式添加網格行不會太糟糕。那麼刪除一行呢? – dab

+0

已經解釋過,'myGridName.RowDefinitions [rownumber]'會給你一個RowDefinition對象。您可以刪除該對象以刪除行定義,或將其高度設置爲0,如我所願。 – har07

+1

哦,我的壞。這就是我只能掃描代碼段的內容。我真的很喜歡把高度設置爲0的想法。這似乎工作。我會等待,看看有沒有人提出另一個解決方案,然後我選擇接受的答案:) – dab

0

仍然使用網格的另一種可能性是將高度綁定到轉換器,該轉換器使用其包含的控件的可見性來決定佈局。

下面是一個例子:

在XAML文件:

<Grid Grid.Row="0" Grid.Column="2" Height="Auto" xmlns:local="clr-namespace:WpfApplication2"> 
    <Grid.Resources> 
     <local:RowHeightConverter x:Key="RowHeightConverter" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="{Binding ElementName=browsc, Path=IsVisible, Converter={StaticResource RowHeightConverter}}" /> 
     <RowDefinition Height="{Binding ElementName=browsa, Path=IsVisible, Converter={StaticResource RowHeightConverter}}" /> 
     <RowDefinition Height="{Binding ElementName=browsb, Path=IsVisible, Converter={StaticResource RowHeightConverter}}" /> 
    </Grid.RowDefinitions> 

    <WebBrowser Grid.Row="0" Name="browsc"></WebBrowser> 
    <WebBrowser Grid.Row="1" Name="browsa" Visibility="Collapsed"></WebBrowser> 
    <WebBrowser Grid.Row="2" Name="browsb"></WebBrowser> 
</Grid> 

您還可以移動使用了「xmlns位到一個頂層窗口,或者您可能已經擁有了它。

在後面的代碼:

public class RowHeightConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var isVisible = value as bool?; 
     if (isVisible.HasValue && isVisible.Value) 
      return new GridLength(1, GridUnitType.Star); 
     else 
      return new GridLength(0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

一旦你建立了代碼一次,就可以改變在XAML設計瀏覽器的「能見度」,看看體現在佈局的變化。