2014-11-08 128 views
1

我有一个TabItem里面有很多元素,我想让ListView可以垂直滚动但是让按钮保持在顶部(不滚动)。我尝试在ScrollViewer中包装ListView,但它不会滚动。我可以将ScrollViewer放在ItemsControl之外,并更新RowDefinition Height="*"以及包括按钮在内的所有内容滚动,但这不是我所需要的。ListView不会滚动垂直

XAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions>  

    <Menu Grid.Row="0" KeyboardNavigation.TabNavigation="Cycle"> 
     <MenuItem Header="File"> 
      <MenuItem Header="Exit" /> 
     </MenuItem> 
     <MenuItem Header="Options" /> 
     <MenuItem Header="Help" /> 
    </Menu> 

    <TextBlock Grid.Row="1" Text="Test" Height="23" Width="Auto" HorizontalAlignment="Left" TextWrapping="Wrap"/> 

    <TabControl Grid.Row="2" > 
     <TabItem Header="TabItem1"> 
      <ItemsControl> 
       <StackPanel Orientation="Horizontal"> 
        <Button Command="{Binding Button1}" Width="150" Margin="5" Height="22" HorizontalAlignment="Left">Button1</Button> 
        <Button Command="{Binding Button2}" CommandParameter="{Binding ElementName=listView}" Width="150" Margin="5" Height="22" HorizontalAlignment="Left">Button2</Button> 
       </StackPanel> 
        <ScrollViewer> 
         <ListView Name="listView" Grid.Row="1" BorderThickness="0" ItemsSource="{Binding myItems}"> 
          <ListView.View> 
           <GridView> 
            <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="Auto" /> 
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="Auto" /> 
           </GridView> 
          </ListView.View> 
         </ListView> 
        </ScrollViewer> 
       </ItemsControl> 
     </TabItem> 

     ... Other tabs 
    </TabControl> 
</Grid> 

回答

3

你不需要ItemsControl,这是默认情况下将商品放进垂直StackPanel这给它的儿童身高增长的无限量。换句话说,ListView有无限的高度来适应所有项目,因此不会显示滚动条。改为使用Grid,然后您不需要ScrollViewer。它的默认模板的一部分ListView反正

<TabItem Header="TabItem1"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <StackPanel Orientation="Horizontal" Grid.Row="0"> 
      <Button Command="{Binding Button1}" Width="150" Margin="5" Height="22" HorizontalAlignment="Left">Button1</Button> 
      <Button Command="{Binding Button2}" CommandParameter="{Binding ElementName=listView}" Width="150" Margin="5" Height="22" HorizontalAlignment="Left">Button2</Button> 
     </StackPanel> 
     <ListView Name="listView" Grid.Row="1" BorderThickness="0" ItemsSource="{Binding myItems}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="Auto" /> 
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="Auto" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</TabItem> 

也在主Grid没有设定最后一行(一个包含TabControl)高度自动,因为这会给TabControl的空间,以适应整个ListView无需滚动

<Grid.RowDefinitions> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition /> 
</Grid.RowDefinitions> 
+0

完美。感谢您的解释! – yellavon 2014-11-08 18:12:30

+0

没问题@yellavon。很高兴帮助 – dkozl 2014-11-08 18:17:01