0

データのリストを表示する複数のセクションがあるかなり複雑なウィンドウを作成しようとしています。ソースに応じて、各セクションはリストに 1 つ以上のアイテムを持つことができます。可能であれば、各リストがデータの量まで縮小されるのが最善ですが、スペースがなくなると、各 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>
4

1 に答える 1

1

RowDefinition を に設定するHeightAuto、行の内部にあるものを収容するために必要なだけ拡張されます。したがって、 、またはそのコンテンツ (内側のグリッド) を設定MaxHeightして、展開できる量を制限する必要があります。RowDefinition

事前にわかっている場合は、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"を使用しました。これは、コンテナーの実際の高さを必要な高さに変換する (つまり、3 で割る) 必要があります。(それがうまくいく場合のように、固定量を使用することもでき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();
    }
}

例

于 2012-09-12T00:17:49.403 に答える