代码之家  ›  专栏  ›  技术社区  ›  Derrick Moeller

WPF:DockPanel最后一个可见子填充?

  •  1
  • Derrick Moeller  · 技术社区  · 10 年前

    我所寻找的行为基本上是DockPanel的行为,我希望最后一个孩子能填满可用空间。关键是我希望它是最后一个可见的孩子。在我的例子中,我想并排显示两个视图。

    到目前为止,我已经尝试将两种不同的样式应用于网格,但似乎都不起作用。我也尝试过使用一个理论上似乎有效的转换器(我能够使用double.NaN返回“Auto”),但我不确定如何从代码中返回宽度为“*”的值。

    <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>
    
    2 回复  |  直到 10 年前
        1
  •  0
  •   Derrick Moeller    10 年前

    我能够运行Rachel的评论,并使用转换器找到解决方案。

    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();
        }
    }
    
        2
  •  0
  •   GWR    6 年前

    我找到了一个更简单的解决方案,那就是用网格元素包围要填充可用空间的元素。因此,使网格成为始终填充可用空间的最后一个元素。网格中的控件可以将其可见性设置为任意值。

        <DockPanel Height="31" HorizontalAlignment="Left" Margin="82,107,0,0" Name="dockPanel1" VerticalAlignment="Top" Width="286" LastChildFill="True">
      <TextBlock Text="Text block" DockPanel.Dock="Left" />
      <Grid>
        <Button Content="Button1" Visibility="Visible" />
        <Button Content="Button2" Visibility="Collapsed" />
      </Grid>
    </DockPanel>