9

私はこの質問を見ていて、非常に奇妙なことを発見しました.行の高さが、Grid.RowSpan.

Gridこれは、私がテストしている簡単な図です。

---------------
| | 1 | | |
--------| 3 |
| | 2 | | |
---------------
| | 4 |
---------------

このグリッドの問題を示すサンプル コードを次に示します。

<Grid ShowGridLines="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <StackPanel Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Background="Red">
        <Label Content="CELL 1 A"/>
        <Label Content="CELL 1 B"/>
        <Label Content="CELL 1 C"/>
    </StackPanel>

    <Grid Grid.Column="0" Grid.Row="2" Background="CornflowerBlue">
        <Label Content="CELL 2 D"/>
    </Grid>

    <StackPanel Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" Background="Yellow">
        <Label Content="CELL 3 A"/>
        <Label Content="CELL 3 B"/>
        <Label Content="CELL 3 C"/>
        <Label Content="CELL 3 D"/>
    </StackPanel>


    <Grid Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" Background="Green">
        <Label Content="CELL 4"/>
    </Grid>
</Grid>

最終結果は、3 番目の行 (セル #2 と #3) の高さに多くの余分なスペースがあります。

ここに画像の説明を入力

Grid.RowSpan1 番目と 3 番目のセルの を +/- 1 で調整しGrid.Row、2 番目と 4 番目のセルを +/- 1 で調整して余分な行を考慮すると、次の (正しい) 結果が得られます。

ここに画像の説明を入力

次のように、セル #3 から十分な要素を削除して、単一の行でレンダリングできるようにすると、正しい結果も得られます。

ここに画像の説明を入力

そして奇妙なことに、いくつかのオブジェクトを削除すると、余分なスペースの一部だけが適用されます

ここに画像の説明を入力

セル #1 と #3 の要素の数、および行の数をいじっていますが、この動作を説明する決定的なパターンを理解できないようです。

Grid.RowSpanこのグリッドをレンダリングして、セル #3のときに余分なスペースが表示されるようにするときに、WPF は舞台裏で何をしているのでしょうか?

4

3 に答える 3

1

余分なスペースについての私の質問のように、私は以前にこの種の状態に遭遇しましたappearing in a ListView

Microsoft の従業員から得た回答によると:

このバグには、これまでに発見された最大サイズを記憶し、今後のすべての Measure 呼び出しで少なくとも同じ大きさのサイズを報告するように強制する、VSP の Measure アルゴリズムのステップが含まれます。あなたの場合、VSP はトリガーが起動する前に最初に測定されるため、すべてが表示されているかのようにサイズが計算されます。トリガーが起動してボタンが折りたたまれると、メジャー アルゴリズムは正しい (小さい) サイズを計算しますが、結果は再び大きくなります。

グリッドの動作は、私の Virtualizing Stack Panel の動作に似ているように見えます:RowDefinitionの Measure 呼び出しで何かが起こっており、記憶させ、常に大きなサイズを報告させます。より良い。

要するに、WPF でバグを見つけた可能性があります。無数の回避策があるため (定義された合計行を必要な合計に一致させ、グリッドを再配置するなど...)、決して注目されない可能性があります。これを確認または反論するには、Microsoft Connect のバグを開いて返信を待つ必要があります。

于 2013-05-13T23:00:20.257 に答える
0

Rob が言ったように、これはおそらく呼び出しを測定する WPF のバグです。だから私はあなたの答えを知りません。しかし、WPF アプリの内部動作を調べるために、私はSnoopを使用します。これは素晴らしいツールで、HTML 要素を表示するブラウザー ツールに似ています。snoop は、WPF フォームがどのようにレイアウトされているか、ネストされた要素、要素のプロパティなどを表示します。言及しようと思いました。

于 2013-05-14T15:52:22.003 に答える