2012-09-12 2 views
0

일부 데이터 목록을 보여주는 여러 섹션이있는 다소 복잡한 창을 만들려고합니다. 이제 소스에 따라 각 섹션은 목록에 하나 이상의 항목을 포함 할 수 있습니다. 가능하다면 각 목록이 데이터 양으로 줄어들면 최상이지만 공간이 부족하면 각 ListView에 스크롤 막대가 표시됩니다.ListView가 창 하단에서 중지되지 않음

격자에 ListView가 있어야한다고 생각했습니다. 내가 누락 된 아이디어가 있습니까?

다음은이 작업을 수행하지 않는 매우 간단한 예입니다. 그 이유는 확실하지 않습니다.

<Window x:Class="Test.ListTestWindow1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    Title="ListTestWindow1" Height="400" Width="500"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid Grid.Row="0"> 
     <StackPanel Orientation="Vertical" HorizontalAlignment="Center"> 
      <Button Content="Some Stuff"/> 
      <TextBlock Text="More Stuff" /> 
      <Button Content="Place holder"/> 
     </StackPanel> 
    </Grid> 
    <Grid Grid.Row="1"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <Grid Grid.Row="0"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 
      <TextBlock Grid.Row="0" Text="List Header Group 1" /> 
      <ListView Grid.Row="1"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Width="120" Header="Date" /> 
         <GridViewColumn Width="120" Header="Day Of Week" DisplayMemberBinding="{Binding DayOfWeek}" /> 
         <GridViewColumn Width="120" Header="Year" DisplayMemberBinding="{Binding Year}" /> 
        </GridView> 
       </ListView.View> 
       <sys:DateTime>1/2/3</sys:DateTime> 
       <sys:DateTime>4/5/6</sys:DateTime> 
       <sys:DateTime>7/8/9</sys:DateTime> 
       <sys:DateTime>10/11/12</sys:DateTime> 
      </ListView>    
     </Grid> 
     <Grid Grid.Row="1"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 
      <TextBlock Grid.Row="0" Text="List Header Group 2" /> 
      <ListView Grid.Row="1"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Width="120" Header="Date" /> 
         <GridViewColumn Width="120" Header="Day Of Week" DisplayMemberBinding="{Binding DayOfWeek}" /> 
         <GridViewColumn Width="120" Header="Year" DisplayMemberBinding="{Binding Year}" /> 
        </GridView> 
       </ListView.View> 
       <sys:DateTime>1/2/3</sys:DateTime> 
       <sys:DateTime>4/5/6</sys:DateTime> 
       <sys:DateTime>7/8/9</sys:DateTime> 
       <sys:DateTime>10/11/12</sys:DateTime> 
      </ListView> 
     </Grid> 
     <Grid Grid.Row="2"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 
      <TextBlock Grid.Row="0" Text="List Header Group 3" /> 
      <ListView Grid.Row="1"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Width="120" Header="Date" /> 
         <GridViewColumn Width="120" Header="Day Of Week" DisplayMemberBinding="{Binding DayOfWeek}" /> 
         <GridViewColumn Width="120" Header="Year" DisplayMemberBinding="{Binding Year}" /> 
        </GridView> 
       </ListView.View> 
       <sys:DateTime>1/2/3</sys:DateTime> 
       <sys:DateTime>4/5/6</sys:DateTime> 
       <sys:DateTime>7/8/9</sys:DateTime> 
       <sys:DateTime>10/11/12</sys:DateTime> 
      </ListView> 
     </Grid> 
    </Grid> 
</Grid> 
</Window> 

답변

1

당신이 RowDefinition의 HeightAuto에가, 다음은 행 내부의 어떤 수용하기 위해 필요한만큼으로 확장 것 설정합니다. 따라서 RowDefinition 또는 그 내용 (내부 그리드)에 MaxHeight을 설정하여 확장 할 수있는 양을 제한해야합니다.

MaxHeight를 미리 알고 있으면 고정 된 값으로 설정할 수 있지만 컨테이너의 백분율로 설정하려는 경우가 많습니다 (예 : Window). 이렇게하려면 컨테이너의 ActualHeight 속성에 바인딩 할 수 있습니다. 예를 들면 : 당신이 원하는 높이로 컨테이너의 실제 높이를 변환해야합니다

<Window x:Name="window" xmlns:clr="clr-namespace:System;assembly=mscorlib"> 
<Grid Name="grid"> 
    <Grid.Resources> 
     <local:HeightConverter x:Key="HeightConverter" /> 
     <clr:Int32 x:Key="Rows">3</clr:Int32> 
    </Grid.Resources>  
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid Grid.Row="0" MaxHeight="{Binding ElementName=window,Path=ActualHeight,Converter={StaticResource HeightConverter},ConverterParameter={StaticResource Rows}}"> 
     <!-- contents ... --> 
    </Grid> 
    <Grid Grid.Row="1" MaxHeight="{Binding ElementName=window,Path=ActualHeight,Converter={StaticResource HeightConverter},ConverterParameter={StaticResource Rows}}"> 
     <!-- contents ... --> 
    </Grid> 
    <Grid Grid.Row="2"> 
     <!-- contents ... --> 
    </Grid> 
</Grid> 
</Window> 
여기

내가 "HeightConverter"을 사용했습니다은 (즉, 세 가지로 나눈다). (즉, 당신을 위해 작동하는 경우에도 단지 MaxHeight=100처럼 고정 된 금액을 사용할 수 있습니다.) 컨버터는 다음과 같이해야한다 : 그것에 대해

public class HeightConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     double? containerHeight = (value as double?); 
     int numberOfRows = (parameter as int?) ?? 1; 
     var contentHeight = (containerHeight.Value/numberOfRows); 
     return contentHeight; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Example

+0

감사합니다. 첫 번째 섹션에 많은 항목이 있고 다른 2 개의 항목에 1 또는 0이있는 것처럼 사용 가능한 공간이 조금 더 똑똑해지기를 바랬습니다. 그러면 첫 번째 섹션은 1/3의 공간을 확장 할 수 없습니다. – Cheval

관련 문제