views:

1779

answers:

1

I’ve got this strange problem whereby the content within a scroll viewer increases in size, the scroll viewer then shows is horizontal scroll bar. However the grid the ScrollViewer is ultimately within doesn’t seem to resize enough to show the scroll bar.

I’ve isolated the problem in this sample app, basically some xaml and some code behind to simulate the content size increase.

Note how the right scroll bar is not correctly showing when you click the resize button, I’ve added some padding to show that its there but not in the correct place.

If I remove the top row it seems to work.

Any ideas and thanks in advance guys and girls?

<UserControl x:Class="SilverlightApplication7.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"
>
<Grid 
    ShowGridLines="True" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch"
>
    <Grid.RowDefinitions>
        <RowDefinition x:Name="DealHeaderRow" Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="DealBarColumn" Width="Auto"></ColumnDefinition>
        <ColumnDefinition x:Name="MarketViewerColumn" Width="Auto"></ColumnDefinition>
        <ColumnDefinition x:Name="DealEditorColumn" Width="*" ></ColumnDefinition>
        <ColumnDefinition x:Name="InfoColumn" Width="Auto"></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <ContentControl 
        x:Name="DealBarRegionContentControl"
        Grid.Row="0"
        Grid.Column="0" 
        Grid.RowSpan="2"
        VerticalContentAlignment="Stretch"
        HorizontalAlignment="Stretch"
        Margin="0">
        <TextBlock Text="DealBarRegion" Width="150" />
    </ContentControl>

    <ContentControl 
        Grid.Row="0"
        Grid.Column="1" 
        Grid.RowSpan="2"
        VerticalContentAlignment="Stretch"
        HorizontalAlignment="Stretch"
        HorizontalContentAlignment="Stretch">
        <Border Background="#FF9AF172">
            <TextBlock Text="MarketViewerRegion"  Width="150"  />
        </Border>
    </ContentControl>

    <ContentControl 
        Grid.Column="2" 
        Grid.ColumnSpan="2"
        Grid.Row="0"
        HorizontalAlignment="Stretch"
        HorizontalContentAlignment="Stretch" >
        <Border Background="#FFC1FC9F">
            <TextBlock Text="DealHeaderRegion"  />
        </Border>
    </ContentControl>

    <ContentControl 
        Grid.Column="2" 
        Grid.Row="1" 
        VerticalAlignment="Top"
        HorizontalContentAlignment="Stretch" 
        VerticalContentAlignment="Stretch">
        <Border Background="MistyRose" >
            <TextBlock Text="DealEditorRegion" />
        </Border>
    </ContentControl>

    <Grid
        Grid.Column="3" 
        Grid.Row="1" 
    >
        <ContentControl 
            x:Name="InfoRegionControl" 
            VerticalContentAlignment="Stretch"
            HorizontalAlignment="Stretch">
            <!-- without the padding here you can't see the scroll bar at all !! Its like the 
            scroll ScrollViewer isn't correctly calculating its width to include the scroll bar,
            or the grid isn't sizing at the points its visible??-->
            <Border Padding="0,0,9,0" MinWidth="200" x:Name="DealInfoControlPlaceHolder">
                <ScrollViewer  
                    HorizontalAlignment="Stretch" 
                    HorizontalContentAlignment="Stretch"
                    VerticalScrollBarVisibility="Auto" 
                    HorizontalScrollBarVisibility="Auto"  
                    >
                    <StackPanel x:Name="ScrollContentPlaceHolder">
                        <Button Click="Button_Click" Content="Rezize Column" x:Name="ResizeButton" />
                    </StackPanel>
                </ScrollViewer>
            </Border>
        </ContentControl>
    </Grid>
</Grid>

And here is the code behind:

using System.Windows;
using System.Windows.Controls;

namespace SilverlightApplication7
{
    public partial class MainPage : UserControl
    {
        double _dealInfoControlPlaceHolderHeight = 0;
        double _dealInfoControlPlaceHolderWidth = 0;

        public MainPage()
        {
            InitializeComponent();

            Loaded += (o, e) =>
            {
                // cache the original width and height
                _dealInfoControlPlaceHolderHeight = DealInfoControlPlaceHolder.Height;
                _dealInfoControlPlaceHolderWidth = DealInfoControlPlaceHolder.Width;
            };
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (ScrollContentPlaceHolder.Height == 1200)
            {
                ScrollContentPlaceHolder.Height = _dealInfoControlPlaceHolderHeight;
                ScrollContentPlaceHolder.Width = _dealInfoControlPlaceHolderWidth;
            }
            else
            {
                ScrollContentPlaceHolder.Height = 1200;
                ScrollContentPlaceHolder.Width = 250;
            }
        }
    }
}
A: 

Ok I don’t know why the above doesn’t work, but as a workaround I just restructure the page so its behaves the same. That works:

<UserControl x:Class="SilverlightApplication7.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"
>
<Grid 
    ShowGridLines="True" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch"
>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="DealBarColumn" Width="Auto"></ColumnDefinition>
        <ColumnDefinition x:Name="MarketViewerColumn" Width="Auto"></ColumnDefinition>
        <ColumnDefinition x:Name="DealEditorColumn" Width="*" ></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <ContentControl 
        x:Name="DealBarRegionContentControl"
        Grid.Column="0" 
        VerticalContentAlignment="Stretch"
        HorizontalAlignment="Stretch"
        Margin="0">
        <TextBlock Text="DealBarRegion" Width="150" />
    </ContentControl>

    <ContentControl 
        Grid.Column="1" 
        VerticalContentAlignment="Stretch"
        HorizontalAlignment="Stretch"
        HorizontalContentAlignment="Stretch">
        <Border Background="#FF9AF172">
            <TextBlock Text="MarketViewerRegion"  Width="150"  />
        </Border>
    </ContentControl>

    <Grid
        Grid.Column="2" >
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <ContentControl 
            Grid.Row="0"
            HorizontalAlignment="Stretch"
            HorizontalContentAlignment="Stretch" >
            <Border Background="#FFC1FC9F">
                <TextBlock Text="DealHeaderRegion"  />
            </Border>
        </ContentControl>

        <Grid 
            Grid.Row="1"     
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"
            >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <ContentControl 
                Grid.Column="0"
                VerticalAlignment="Top"
                HorizontalContentAlignment="Stretch" 
                VerticalContentAlignment="Stretch">
                <Border Background="MistyRose" >
                    <TextBlock Text="DealEditorRegion" />
                </Border>
            </ContentControl>
            <ContentControl 
                Grid.Column="1"
                x:Name="InfoRegionControl" 
                VerticalContentAlignment="Stretch"
                HorizontalAlignment="Right">
                <!-- without the padding here you can't see the scroll bar at all !! Its like the 
                scroll ScrollViewer isn't correctly calculating its width to include the scroll bar,
                or the grid isn't sizing at the points its visible??-->
                <Border Padding="0,0,9,0" MinWidth="200" x:Name="DealInfoControlPlaceHolder">
                    <ScrollViewer  
                        HorizontalAlignment="Stretch" 
                        HorizontalContentAlignment="Stretch"
                        VerticalScrollBarVisibility="Auto" 
                        HorizontalScrollBarVisibility="Auto"  
                        >
                        <StackPanel x:Name="ScrollContentPlaceHolder">
                            <Button Click="Button_Click" Content="Rezize Column" x:Name="ResizeButton" />
                        </StackPanel>
                    </ScrollViewer>
                </Border>
            </ContentControl>
        </Grid>
    </Grid>
</Grid>

Keith