如何在垂直StackPanel中垂直拉伸WPF Expander

时间:2015-07-08 23:29:32

标签: wpf xaml stackpanel expander

鉴于下面的XAML,是否可以进行调整,以便在展开Expander个项目时,TextBlock内容垂直拉伸以填充剩余空间? (请注意,此XAML是故意简化的,解决方案必须满足此简单示例和任何数据绑定ItemsSource方案)。

StackPanel本身会拉伸以填充空格(因为它包含在Grid中),因此我假设StackPanel measuring code内存在冲突不允许无限大的内容元素。我甚至不确定这是否可以优雅地解决,它可能只需要手动覆盖测量代码并确定内容容器的最佳扩展高度。

<Grid>
    <StackPanel>
        <Expander Header="Item 1">
            <TextBlock Background="LightCoral" Text="Content 1 should be stretched vertically when expanded"/>
        </Expander>
        <Expander Header="Item 2">
            <TextBlock Background="LightBlue" Text="Content 2 should be stretched vertically when expanded"/>
        </Expander>
    </StackPanel>
</Grid>

注意:我通读了How to get StackPanel's children to fill maximum space downward?并且它与此问题并不真正相关,因为该帖子的解决方案是使用DockPanel这是不可能的数据绑定ItemsSource方案。

1 个答案:

答案 0 :(得分:0)

StackPanel将内容高度设置为自动,即使它被放置在网格控件中也是如此。 &#39;网格&#39;应该用来代替StackPanel,然后从后面的代码设置行高。 这是一个例子;

       <Grid>

            <Grid.RowDefinitions>
                <RowDefinition x:Name="row1" Height="auto"/>
                <RowDefinition x:Name="row2" Height="auto"/>
            </Grid.RowDefinitions>
            <Expander Header="Item 1"  Expanded="Expander_Expanded_1" VerticalAlignment="Stretch" >               
                    <TextBlock Background="LightCoral" Text="Content 1 should be stretched vertically when expanded" VerticalAlignment="Stretch"/>              
            </Expander>
            <Expander Header="Item 2" Grid.Row="1" Expanded="Expander_Expanded_2" VerticalAlignment="Stretch" >               
                    <TextBlock Background="LightBlue" Text="Content 2 should be stretched vertically when expanded" VerticalAlignment="Stretch"/>             
            </Expander>

        </Grid>

在后面的代码中,您可以在展开的事件

上设置行的高度
private void Expander_Expanded_1(object sender, RoutedEventArgs e)
        {
            ex2.Height = new GridLength(1, GridUnitType.Auto);
            ex1.Height = new GridLength(1, GridUnitType.Star);
        }