views:

1059

answers:

4

How can I constrain a vertical WPF StackPanel's width to the most narrow item it contains. The StackPanel's width must not be greater than the width of any other child element.

A: 

You can't. A vertically oriented StackPanel will always allocate as much width as its children request.

You'd be best off writing a custom panel to achieve your desired behavior.

HTH, Kent

Kent Boogaart
A: 

It's simple enough to bind a StackPanel's width to a particular control's width, like this:

<Window>
  <Grid>
    <StackPanel Width="{Binding ElementName=btnAbc,Path=ActualWidth}">
      <Button HorizontalAlignment="Center" Width="50" 
          Name="btnAbc">abc</Button>
      <Button>abcdefghijkl</Button>
    </StackPanel>
  </Grid>
</Window>

You can experiment with various widths (or delete the Width property for autosizing) of btnAbc, and see that the StackPanel respects the setting.

If you don't know in advance which control will be narrowest, it's a bit more complicated. One way to do it would be with a custom IValueConverter. Your IValueConverter-implementing class could bind the StackPanel's width to the StackPanel itself. It would then go through the StackPanel's children, find the ActualWidth of each, and bind to the narrowest of those values.

Kyralessa
+2  A: 
PaulJ
+1  A: 

i have tried binding to the ActualWidth property, even creating a converter to offset the value, and this works great with one exception: as you expand the size of the container, the width is updated properly, but when to make the container smaller, the width of the actual content gets smaller, but the "page width" of any scrollviewers will not. i'm sure there's a way to work around this, but i haven't found it.