ScrollViewer中的WPF WrapPanel问题

时间:2016-09-28 12:10:54

标签: wpf xaml

关于SO有很多类似的问题,但到目前为止我还没能解决使用它们的问题。

我在WrapPanel中有一堆控件,而WrapPanel在ScrollViewer中。 ScrollViewer位于网格内。

我正在尝试让WrapPanel中的所有<Border>控件都具有&#39; Vertical&#39; (这样它们就会向下流动,当没有更多空间垂直留下时,它们会水平缠绕)并且当水平方向上没有剩余空间时会出现Horizo​​ntalScrollBar。

到目前为止我的代码如下:

<Grid x:Name="configGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />                            
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Auto" Width="{Binding ElementName=configGrid, Path=ActualWidth}" Height="{Binding ElementName=configGrid, Path=ActualHeight}">
        <WrapPanel HorizontalAlignment="Left" Orientation="Vertical" x:Name="ConfigWrapPanel" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollViewer}}, Path=ActualWidth}">

            <Border BorderBrush="White" BorderThickness="1,1,1,1" CornerRadius="2" Margin="10">
                <Expander IsExpanded="True" BorderThickness="0" Header="General">
                    // some controls here
                </Expander>
            </Border>

            <Border BorderBrush="White" BorderThickness="1,1,1,1" CornerRadius="2" Margin="10">
                <Expander IsExpanded="True" BorderThickness="0" Header="Another Block">
                    // some controls here
                </Expander>
            </Border>

            // many more <border> blocks here....

        </WrapPanel>
    </ScrollViewer>
</Grid>

这个几乎按预期工作,各种内容垂直流动,当底部没有足够的空间时,它向上和向右移动并再次从顶部开始。但我从来没有得到任何水平滚动条,控件只是从屏幕右侧消失。

我确信这是非常简单的事情,但我无法理解这一点。

作为一些进一步的信息,各种Border控件和子元素都是动态宽度和高度(这就是我选择垂直方向WrapPanel而不是Horizo​​ntal的原因)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您必须从WrapPanel中删除Width

该宽度想要拉伸到无穷大,这会阻止ScrollViewer更正地测量WrapPanel的边界,导致从不显示ScrollBar。

下面的代码显示了一个工作示例:

<Grid x:Name="configGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Auto"  Height="{Binding ElementName=configGrid, Path=ActualHeight}">
            <WrapPanel HorizontalAlignment="Left" Orientation="Vertical" x:Name="ConfigWrapPanel" >

                <Border BorderBrush="White" BorderThickness="1,1,1,1" CornerRadius="2" Margin="10">
                    <Expander IsExpanded="True" BorderThickness="0" Header="General">
                        // some controls here
                    </Expander>
                </Border>

                <Border BorderBrush="White" BorderThickness="1,1,1,1" CornerRadius="2" Margin="10">
                    <Expander IsExpanded="True" BorderThickness="0" Header="Another Block">
                        // some controls here
                    </Expander>
                </Border>


            </WrapPanel>
        </ScrollViewer>
    </Grid>