Undiscouraged
Undiscouraged

Reputation: 1125

Xaml ScrollViewer scrollbars are not shown

I have a UserControl which contains a ScrollViewer.

<UserControl>
    <ScrollViewer Name="ScrollContainerScroller"
                  VerticalScrollBarVisibility="Auto"
                  HorizontalScrollBarVisibility="Hidden">
       <ListBox Name="MyItemsListBox" ItemsSource="{Binding MyItems}"/>
    </ScrollViewer>
</UserControl>

When consuming this UserControl inside a stackpanel the ScrollViewer's scrollbars are not shown.

<Border>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/> <!-- top -->
            <RowDefinition Height="*"/>    <!-- content -->
            <RowDefinition Height="Auto"/> <!-- bottom -->
        </Grid.RowDefinitions>

        <StackPanel Grid.Row="1" VerticalAlignment="Top">
            <Grid Name="ContentButtons" Height="20">
                <Button Name="MinimizeContent"/>
                <Button Name="MaximizeContent"/>
            </Grid>
            <ContentControl Name="MyContent"/>
        </StackPanel>

        <!--
        <ContentControl Name="MyContent" Grid.Row="1" VerticalAlignment="Top"/>
        -->

        <Grid Name="MyBottomControls" Grid.Row="2" VerticalAlignment="Bottom">
                <Button Name="Delete" HorizontalAlignment="Left"  Style="{StaticResource DeleteButtonStyle}"/>
                <Button Name="Close" HorizontalAlignment="Center" Style="{StaticResource CloseButtonStyle}"/>
                <Button Name="Hide" HorizontalAlignment="Right"  Style="{StaticResource HideButtonStyle}"/>
         </Grid>

        <!-- shows up at last so the Grid can place it at the very top it in the Z axis -->
        <ContentControl Name="MyTop" Grid.Row="0" VerticalAlignment="Top"/>
    </Grid>
</Border>

When I remove the wrapping stackpanel the scrollviewer is shown correctly.

What do I have to do for making the scrollbars also work with the additional stackpanel which wraps the MyContent-contentcontrol?

Upvotes: 0

Views: 472

Answers (1)

VidasV
VidasV

Reputation: 4895

StackPanel resize does not calculate maximum height or widht which could invoke scrollbars to appear. You should use Grid instead and align items in it.

<Border>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/> <!-- top -->
            <RowDefinition Height="*"/>    <!-- content -->
            <RowDefinition Height="Auto"/> <!-- bottom -->
        </Grid.RowDefinitions>

        <Grid Grid.Row="1" VerticalAlignment="Top">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/> 
                <RowDefinition Height="*"/>    
            </Grid.RowDefinitions>
            <Grid Name="ContentButtons" Height="20">
                <Button Name="MinimizeContent"/>
                <Button Name="MaximizeContent"/>
            </Grid>
            <ContentControl Grid.Row="1" Name="MyContent"/>
        </Grid >

        <!--
        <ContentControl Name="MyContent" Grid.Row="1" VerticalAlignment="Top"/>
        -->

        <Grid Name="MyBottomControls" Grid.Row="2" VerticalAlignment="Bottom">
                <Button Name="Delete" HorizontalAlignment="Left"  Style="{StaticResource DeleteButtonStyle}"/>
                <Button Name="Close" HorizontalAlignment="Center" Style="{StaticResource CloseButtonStyle}"/>
                <Button Name="Hide" HorizontalAlignment="Right"  Style="{StaticResource HideButtonStyle}"/>
         </Grid>

        <!-- shows up at last so the Grid can place it at the very top it in the Z axis -->
        <ContentControl Name="MyTop" Grid.Row="0" VerticalAlignment="Top"/>
    </Grid>
</Border>

Upvotes: 3

Related Questions