【问题标题】:How can you make a WPF Expander stretch vertically within a vertical StackPanel如何使 WPF 扩展器在垂直 StackPanel 中垂直拉伸
【发布时间】:2015-09-27 03:01:52
【问题描述】:

鉴于下面的 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,这在数据绑定@987654331 中是不可能的@场景。

【问题讨论】:

  • 我认为这实际上不是一个(微不足道的)可解决的问题。由于高度约束不是相互排斥的。基本上,如果任何扩展器要更改其 IsExpanded 状态,您将需要重新布局堆栈面板中的所有扩展器。

标签: wpf xaml stackpanel expander


【解决方案1】:

StackPanel 将 Content Height 设置为 auto,即使它被放置在 Grid 控件中。 'Grid' 应该用来代替 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);
        }

【讨论】:

  • 不幸的是,这不能正确回答问题,因为这在数据绑定 ItemsSource 场景中不是一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2013-09-05
相关资源
最近更新 更多