如何防止ListView扩展窗口维度?

时间:2010-09-12 12:48:50

标签: c# wpf listview height viewmodel

我将ListView放在View的中间行。该视图包含在SizeToContent设置为WidthAndHeight的窗口中。 ListView最初是空的,但底层的ViewModel在此过程中填充此列表视图。

中间Grid.Row高度设置为*以填充窗口的可用大小。当ListView接收新项目时,它将在某些时候扩展窗口大小,而不是在ListView中显示ScrollViewer。如何防止此行为将SizeToContent设置为WidthAndHeight,Grid.Row高度为*但没有ListView扩展窗口尺寸?

这是窗口的代码(Workspace属性将包含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>

提供的ViewModel的视图如下所示:

<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>

4 个答案:

答案 0 :(得分:5)

在为你加载工作后关闭窗口会自动调整吗?

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.SizeToContent = SizeToContent.Manual;
    }

答案 1 :(得分:2)

您必须限制层次结构中的一个动态大小的元素。即将windown,grid或listboxt的maximumheight / maximumwithheight / with属性设置为适当的值。

答案 2 :(得分:0)

您实际上可以将ListView放入Dockpanel,对我来说效果很好:

<Grid x:Name="QueryNinjasGrid" Grid.Row="1">
    <DockPanel>
        <Button DockPanel.Dock="Top" x:Name="QueryNinjasButton" Content="Query Ninjas" FontSize="20" Margin="20" MaxWidth="150" Click="QueryNinjasButton_Click"/>
        <ListView x:Name="NinjaListView" VerticalAlignment="Stretch" MinHeight="150" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.CanContentScroll="False" >
            <ListView.View>
                <GridView>
                     <GridViewColumn Header="Id" Width="20" DisplayMemberBinding="{Binding Id}"/>
                     <GridViewColumn Header="Name" Width="150" DisplayMemberBinding="{Binding Name}" />
                 </GridView>
             </ListView.View>
        </ListView>
    </DockPanel>
</Grid>

答案 3 :(得分:0)

正如 AxelEckenberger 10 多年前所写的那样,要实现这一点,您必须将 ListView 的 MaxHeight 设置为其父级的高度。不幸的是,他没有解释如何实现这一点。

以下是使任何控件适合其父级的方法:

<ParentControl>
    <ChildControl Height="200" 
        MaxHeight="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
            AncestorType={x:Type ParentControl}}, Path=ActualHeight,
            Mode=OneWay}">
    </ChildControl>
</ParentControl>

注意事项:

  • 绑定到 ActualHeight 而不是 Height 可防止在 Visual Studio 的“XAML 绑定失败”视图中出现警告,指出 NaN 不是 {{1} 的有效值}.
  • 严格来说,MaxHeight 是不必要的,因为 Mode=OneWay 不太可能改变,但它有助于证明我们只希望 MaxHeightMaxHeight 设置的事实我们从不打算发生相反的情况。