2014-09-15 4 views
0

Поведение, которое я ищу, в основном таково, что DockPanel, я хотел бы, чтобы последний ребенок заполнил доступное пространство. Уловка состоит в том, что я хотел бы, чтобы это был последний видимый ребенок. В моем случае у меня есть два вида, которые я хотел бы показать бок о бок.WPF: DockPanel Последнее видимое заполнение ребенка?

До сих пор я пробовал применять два разных стиля к сетке, и ни одна из них не работает. Я также попытался использовать конвертер, который, казалось, работал в теории (я смог вернуть «Авто» с помощью double.NaN), но я не был уверен, как вернуть ширину «*» из кода.

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"> 
      <ColumnDefinition.Style> 
       <Style TargetType="{x:Type ColumnDefinition}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Visibility, ElementName=ccSomeItems}" Value="Collapsed"> 
          <Setter Property="Width" Value="0" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ColumnDefinition.Style> 
     </ColumnDefinition> 
     <ColumnDefinition Width="*"> 
      <ColumnDefinition.Style> 
       <Style TargetType="{x:Type ColumnDefinition}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding SomeOtherItems.AllOtherItems.Count, Converter={StaticResource IntegerToVisibilityConverter}}" Value="Collapsed"> 
          <Setter Property="Width" Value="0" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ColumnDefinition.Style> 
     </ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <ContentControl x:Name="ccSomeItems" Content="{Binding SomeItems}" Margin="4" Visibility="{Binding SomeItems.AllItems.Count, Converter={StaticResource IntegerToVisibilityConverter}}" /> 
    <ContentControl Grid.Column="1" Content="{Binding SomeOtherItems}" Margin="4" Visibility="{Binding SomeOtherItems.AllOtherItems.Count, Converter={StaticResource IntegerToVisibilityConverter}}" /> 
</Grid> 
+0

Я запутался ... почему вы используете 'Grid' вместо' DockPanel', если вы хотите, чтобы поведение 'DockPanel'? Кроме того, вы можете использовать тип единицы «GridUnitType.Star» для указания размеров звезд в коде позади, например: 'new GridLength (2, GridUnitType.Star)' – Rachel

+0

Я использую Grid для создания поведения, которое делает DockPanel не содержат (насколько мне известно). Как я уже сказал, уловка состоит в том, что я хотел бы заполнить последний ** видимый ** ребенок. Я исследую класс GridLength. –

ответ

0

Я смог работать с комментарием Рэйчел и найти решение с помощью конвертера.

XAML:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="{Binding Visibility, ElementName=SomeItems, Converter={StaticResource VisibilityToGridLengthConverter}}" /> 
     <ColumnDefinition Width="{Binding Visibility, ElementName=SomeOtherItems, Converter={StaticResource VisibilityToGridLengthConverter}}" /> 
    </Grid.ColumnDefinitions> 
    <ContentControl x:Name="SomeItems" Content="{Binding SomeItems}" Visibility="{Binding SubPackages.AllPackages.Count, Converter={StaticResource IntegerToVisibilityConverter}}" /> 
    <ContentControl x:Name="SomeOtherItems" Grid.Column="1" Content="{Binding SomeOtherItems}" Visibility="{Binding Elements.AllElements.Count, Converter={StaticResource IntegerToVisibilityConverter}}" /> 
</Grid> 

И конвертер:

[ValueConversion(typeof(Visibility), typeof(GridLength))] 
public class VisibilityToGridLengthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (Visibility)value == Visibility.Collapsed ? new GridLength(0) : new GridLength(1, GridUnitType.Star); 
    } 

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