views:

69

answers:

2

Hi,

I put a ListView in the middle row of a View. The view is contained in a window that has SizeToContent set to WidthAndHeight. The ListView is initially empty, but the underlying ViewModel fills this list view in the process.

The middle Grid.Row height is set to * to fill the available size of the window. When the ListView receives new items, it will at some point expand the window size instead of displaying the ScrollViewer in the ListView. How can I prevent this behavior to have SizeToContent set to WidthAndHeight, the Grid.Row height to * but not have the ListView expand the window dimensions?

Here's the code for the window (the Workspace property will contain the ViewModel):

<Window x:Class="Views.ContainerWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="{Binding Title}"
        SizeToContent="WidthAndHeight">
   <ContentControl Content="{Binding Workspace}"/>
</Window>

The View for the provided ViewModel looks like this:

<UserControl x:Class="Views.SomeView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             MinHeight="450">
   <Grid>
      <Grid.RowDefinitions>
         <RowDefinition Height="Auto"/>
         <RowDefinition Height="*"/>
         <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
      <TextBlock Grid.Row="0" 
                 TextWrapping="Wrap" 
                 Margin="5"
                 Text="Some description text"/>
      <ListView Grid.Row="1"
                ItemsSource="{Binding ItemsList}" 
                Margin="5">
         <ListView.View>
            <GridView>
               ...
            </GridView>
         </ListView.View>
      </ListView>
      <Button Grid.Row="2"
              HorizontalAlignment="Right"
              Command" Value="{Binding CloseCommand}"/>
   </Grid>
</UserControl>
+1  A: 

You will have to restrict one of the dynamically sized elements in the hierarchy. I.e. set maximumheight/maximumwith or the height/with properties of the windown, the grid, or the listboxt to an appropriate value.

Obalix
I'd rather not do that. I'm looking for a way to not let the ListView expand, if items are added.
HA
I was trying to bind the ListView height or maximum height to the current height of the middle Grid.Row, but that didn't help.
HA
Well you will need to restrict something. If the listbox can grow then you will not see the scroll panel. But the unresticted growth of the lisbox leads to an unrestricted growth of the window. Typlical catch 22. So, IMHO, using a maximum size for the window or lisbox will get you there where you want - make the window as small as possible, but if it gets too big, a scroll bar is shown on the listbox.
Obalix
You're probably right, but I'm still looking for that way to prevent the ListView from growing. Everything else is working as expected and the ListView contains a ScrollViewer, so it shouldn't be impossible to display the scrollbars instead of growing vertically in this scenario. :/
HA
Well if you want avoid the list view from growing vertically, you will have to set either the height (does not get smaller or bigger) or maximumHeight (gets smaller but not bigger) attribute of the list view.
Obalix
I found a satisfying solution. I need the SizeToContent property only for the initial window state. So I removed that after the window has been loaded. Thanks for your help.
HA
+1  A: 

Would turning off the window autosizing after it has loaded work for you?

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.SizeToContent = SizeToContent.Manual;
    }
Ninfendo
Thank you. This is in fact the solution I used. You can see that, if you expand the comments above. :)
HA