1

ItemTemplate として Expander 内に DataGrid を持つ ItemsControl があります。

<Grid>
    <ScrollViewer HorizontalScrollBarVisibility="Auto"
                  VerticalScrollBarVisibility="Auto">
        <ItemsControl ItemsSource="{Binding SomeItemSource}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Expander>
                        <Grid>
                            <DataGrid ItemsSource="{Binding SomeItemSource}"
                                      ScrollViewer.CanContentScroll="True"
                                      ScrollViewer.VerticalScrollBarVisibility="Auto"
                                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
                                      MaxHeight="200">
                            </DataGrid>
                        </Grid>
                    </Expander>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
</Grid>

DataGrid ごとに ScrollViewer が必要であり、エキスパンダーが多すぎる場合はエキスパンダーのリスト用に 1 つ必要です。私の問題は、DataGrid の MaxHeight プロパティを設定した場合にのみ機能することです。たとえば、ItemsControl にエントリが 1 つしかない場合、高さが制限されているため、エントリがスペース全体を使用していないため、これは面倒です。

誰にもアイデアはありますか?

4

1 に答える 1

0

うーん、あなたが何をしているのか理解するのは難しいですが、これはあなたをさらに助けるかもしれません.

問題は ScrollViewer です。ScrollViewer が WPF で何をするかをお見せしましょう。

デフォルトの動作は、ユーザーが ScrollBars を使用するかどうかを切り替えることです。

ユーザーが設定を行っていない場合、ScrollViewer は ScrollBars を使用しようとします。したがって、ScrollViewer は無限を値として子に渡し、子が必要なだけのスペースを使用できるようにします。あなたの場合の最終結果は、ScrollViewerで目的のサイズ(使用可能なサイズよりも小さい)で配置できるため、1つのアイテムしか存在しない場合、使用可能なすべてのスペースがいっぱいにならないことです。基本的に言い換えれば、ScrollViewer は子供たちに言います。ユーザーがスクロールできるように、ScrollBars を表示するだけです。ScrollViewer はかなりばかげています。

フルフィル スペースの動作を受け取るには、ScrollViewer に ScrollBar を無効にするように指示する必要があります。次に、ScrollViewer は無限大を測定値として子に渡しませんが、代わりにウィンドウ/使用可能なスペースのサイズを渡します。子供たちは固定の幅と高さがそこにある (無限ではない) ことに気づき、指定されたスペースを埋めるために自分自身を測定します。(子供たちが望むサイズは、ウィンドウのサイズまたは利用可能なスペースのサイズであり、彼らが望むものではないことを意味します。彼らが望むものは、とにかく利用可能なスペースよりも小さいです)

総括する。アイテムが 1 つの場合は、ScrollBars を無効にするか、ScrollViewer をまったく使用しないでください。ScrollViewer をそのままにして、Expander を Grid の次のノードにします。エキスパンダーは利用可能なスペースを完全に使用します。ただし、ItemsSource に新しいアイテムを追加したことに気付いた場合は、テンプレートを交換し、Expander の周りで ScrollViewer を使用してスクロールできるようにします。

少なくとも 1 つのアイテムを完全なサイズにする方法についてのアイデアが得られたことを願っています。

于 2013-10-21T09:28:43.173 に答える