8

水平ヘッダーと垂直ヘッダーの両方を持つテーブルが必要です (単純な PivotGrid)。ここでいくつかの同様の(またはほぼ同じ)問題を見つけましたが、誰も解決策を提供しません。XAML では、次の構造を定義しました。

<Grid x:Name="grdMain" Background="White" Grid.IsSharedSizeScope="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid Grid.Row="0" Grid.Column="1" x:Name="grdHorizontalHeader">
        <!-- place for column definitions and header labels defined in code -->
    </Grid>
    <Grid Grid.Row="1" Grid.Column="0" x:Name="grdVerticalHeader">
        <!-- place for column definitions and header labels defined in code -->
    </Grid>
    <Grid Grid.Row="1" Grid.Column="1" x:Name="grdContent">
        <!-- place for column definitions and header labels defined in code -->
    </Grid>
</Grid>

したがって、両方のヘッダーはいくつかの ColumnDefinitions (それぞれ RowDefinitions) を持つグリッドで構成されており、Content-ColumnDefinitions に従って Header-ColumnDefinitions のサイズを設定する必要があります。私はコードでそれを行います:

foreach (var row in myColumnSource)
{

    // Content columns definitions

    var cD = new ColumnDefinition();
    cD.Width = GridLength.Auto;
    cD.SharedSizeGroup = "ColumnSharedSizeGroup" + row.Value;
    this.grdContent.ColumnDefinitions.Add(cD);

    // Header columns definitions

    var cD2 = new ColumnDefinition();
    cD2.Width = GridLength.Auto;
    cD2.SharedSizeGroup = "ColumnSharedSizeGroup" + row.Value;
    this.grdHorizontalHeader.ColumnDefinitions.Add(cD2);
    ...

したがって、Header-Column はその Width を Content-Column と共有する必要があります。しかし、プログラムを実行すると、列が跳ね返り、無限ループでサイズ変更されます。行の高さの共有は正常に機能します。どこに問題があるのでしょうか?

ヘッダー (grdHorizo​​ntalHeader) のEDIT列のみがサイズ変更されます。grdContent の列の幅が正しく安定しています。

4

2 に答える 2

3

1 つのグリッドに多数の SharedSizeGroup 列がある場合、結果のレイアウトでは、指数関数的に増加するパスを実行してそれらを並べ替えようとします。Microsoft がバグを認めたとどこかで誰かが言っていましたが、詳細はわかりませんでした。

この問題を解決するために、StackPanel 内でグリッドを小さなグリッドに分割しました。これにより、レイアウトが再び高速になり、共有のサイズが維持されました。

グリッドは 2 次元であるため、これは難しくなります。コントロールを動的に追加しているので、小さなグリッドを保持する水平 StackPanel を保持する 1 つの垂直 StackPanel を持つことができますか?

于 2015-04-21T20:29:31.387 に答える
3

グリッド コントロールの自動サイズ変更アルゴリズムは、場合によっては扱いにくい場合があります。

各列/行に MinWidth を設定しようとしましたか?

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" MinWidth="30" />
    <ColumnDefinition Width="Auto" MinWidth="30" />
    <ColumnDefinition Width="Auto" MinWidth="30" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="Auto" MinHeight="15" />
    <RowDefinition Height="Auto" MinHeight="15" />
    <RowDefinition Height="Auto" MinHeight="15" />
</Grid.RowDefinitions>

非常にエレガントではありませんが、これと同じ問題を修正しました。

于 2013-11-01T15:09:56.560 に答える