tags:

views:

38

answers:

2

Please, let's focus on the horizontal size (width).

I have horizontal StackPanel which auto-resizes to occupy entires space (it "expands"). Within it I have Grid (with 3 columns) and a scrollbar. The scrollbar width should be fixed, but Grid should expand. How can I force it to do it?

Current code:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
  <Grid Name="grid1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">

    <Grid.RowDefinitions>
      <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto"></ColumnDefinition>
      <ColumnDefinition Width="2"></ColumnDefinition>
      <ColumnDefinition></ColumnDefinition>

  </Grid.ColumnDefinitions>

  <StackPanel Orientation="Vertical" Grid.Column="0" HorizontalAlignment="Stretch">
    <Label Content="Label" HorizontalAlignment="Center" Name="label1" VerticalAlignment="Bottom" />
  </StackPanel>
  <GridSplitter DragCompleted="OnDragCompleted"  ShowsPreview="True" Name="gridsplitter1" Background="Red" Grid.Column="1" Grid.Row="0" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
  <StackPanel Orientation="Vertical" Grid.Column="2" HorizontalAlignment="Stretch">
    <Label Content="Label" HorizontalAlignment="Center" Name="label2" VerticalAlignment="Bottom" />
  </StackPanel>

  </Grid>

  <ScrollBar Name="scrollBarV" Orientation="Vertical" />

</StackPanel>

No matter what I do, width=auto, horizontalalignment=strech, every time each column of the grid occupies only the required space (sufficient for showing its content), not entire space available.

+1  A: 

Try

<ColumnDefinition Width="*"></ColumnDefinition>

Columns and rows that are defined within a Grid can take advantage of Star sizing to distribute remaining space proportionally. When Star is selected as the height or width of a row or column, that column or row receives a weighted proportion of the remaining available space. This is in contrast to Auto, which distributes space evenly based on the size of the content that is within a column or row. This value is expressed as * or 2* when you use Extensible Application Markup Language (XAML)

Source

ChrisF
Thank you for pointing it out, I was somehow convinced that Auto=*.
macias
+2  A: 

A horizontal StackPanel will always give its children their desired width, so it will never force the Grid to be larger than it wants to be. You will need to use a different kind of panel. One option is to use a DockPanel, and dock the ScrollBar to the right and let the Grid fill in the rest:

<DockPanel HorizontalAlignment="Stretch">
    <ScrollBar DockPanel.Dock="Right" Name="scrollBarV" Orientation="Vertical" />
    <Grid Name="grid1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        ...
    </Grid>
</DockPanel>

Another option is to use a Grid with the second column using Auto to size to the ScrollBar exactly and the first column left at the default of 1* to use the rest of the space:

<Grid HorizontalAlignment="Stretch">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Grid Name="grid1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        ...
    </Grid>
    <ScrollBar Grid.Column="1" Name="scrollBarV" Orientation="Vertical" />
</Grid>
Quartermeister
Works beautifully, thank you very much!
macias