0

次のXAMLを検討してください。

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="*" MinHeight="100" />
      <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <ListBox>
      <ListBox.Items>
        <ListBoxItem>a</ListBoxItem>
        <!-- Another 11 items -->
      </ListBox.Items>
    </ListBox>
    <ListBox Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Visible">
      <ListBox.Items>
        <ListBoxItem>1</ListBoxItem>
        <!-- Another 23 items -->
      </ListBox.Items>
    </ListBox>
  </Grid>
</Window>

2行目のListBoxは、垂直スクロールバーが無効になっていることを示しており、単にコンテンツを切り取っています。

ウィンドウの表示領域に制限する必要があります。これを達成する方法は?

2番目のグリッド行の高さを[自動]に設定する理由:十分なスペースがあり、最初のリストボックスが残りのスペースを取る必要がある場合、2番目のリストボックスにスクロールバーなしですべてのコンテンツを表示する必要があります。

4

1 に答える 1

1

純粋なXAMLで必要なことを行う方法はないと思います。2つのリストボックスのいずれかに特定の高さを設定するか、固定の比率を設定する必要があります。

コードビハインドに少しのコードを入れれば、やりたいことができると思います。次のようにRowDefinitionsとListboxesの名前を付け、GridSizedChangedイベントをサブスクライブします。

<Grid SizeChanged="GridSizeChanged">
    <Grid.RowDefinitions>
        <RowDefinition x:Name="row1"/>
        <RowDefinition x:Name="row2"/>
    </Grid.RowDefinitions>
    <ListBox x:Name="lb1">
        <ListBox.Items>
            <ListBoxItem>a</ListBoxItem>
        </ListBox.Items>
    </ListBox>
    <ListBox x:Name="lb2" Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Visible">
        <ListBox.Items>
            <ListBoxItem>1</ListBoxItem>
            <!-- Another 23 items -->
        </ListBox.Items>
    </ListBox>
</Grid>

次に、次の方法でイベントを処理します。

private void GridSizeChanged(object sender, SizeChangedEventArgs e)
{
    double newHeight = e.NewSize.Height;
    int lb1ItemCount = lb1.Items.Count;
    int lb2ItemCount = lb2.Items.Count;
    row1.Height = new GridLength(newHeight * lb1ItemCount / (lb1ItemCount + lb2ItemCount));
    row2.Height = new GridLength(newHeight * lb2ItemCount / (lb1ItemCount + lb2ItemCount));
}

これにより、2つのリストボックスのサイズが、リストボックス内にあるアイテムの数に比例するように設定されます。最初のリストボックスに最小サイズ100を設定する場合は、最初にそのサイズを設定するためにもう少し作業を行う必要があります。次に、最初のサイズの計算値に基づいて2番目のサイズを計算します。

編集: 私はあなたが必要とするものを正確に実行するGridSizeChangedのバージョンを書いたと思います。このバージョンでは、lb2の高さを、上位100pxを除くグリッド全体(必要なリストボックスのサイズがこれよりも大きい場合)、またはそれが小さい場合はそれ自体の希望のサイズに設定します。最初のリストボックスは残りのすべてのスペースを埋めます。lb2が上部の100ピクセルを埋めることを許可しなかったため、必要に応じて最小の高さは100ピクセルになります。

private void GridSizeChanged(object sender, SizeChangedEventArgs e)
{
    lb2.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    double lb2DesiredHeight = lb2.DesiredSize.Height;

    double newHeight = e.NewSize.Height;
    double lb2AvailableHeight = newHeight - 100;

    double lb2ActualHeight = Math.Min(lb2DesiredHeight, lb2AvailableHeight);
    row1.Height = new GridLength(newHeight - lb2ActualHeight);
    row2.Height = new GridLength(lb2ActualHeight);
}
于 2012-11-15T11:02:22.340 に答える