10

Silverlight アプリケーションに があり、コレクションDataGridを操作するときに行を追加したり、行を削除したりして、うまく動作します。ItemsSourceただし、追加の行、または最後のデータ行の後に常に表示されるコントロールが必要です。

を使用し、RowsPresenter 行を Auto height に設定して、最後の行の後に表示する追加のコントロールを取得できますがControlTemplate、これは、レンダリング領域が小さすぎる場合に行がスクロールしないことを意味します。ただし、RowsPresenter の行の高さを Star に変更すると、行はスクロールしますが、追加のコントロールは最後の行の下部ではなく、データ グリッドの下部に固定されて表示されます。

コントロールを希望どおりに表示しながら、RowsPresenter でスターの高さを動作させる方法はありますか?

私の現在の考えでは、何らかの方法で LoadingRow イベントを使用して最後の行の位置を見つけ、キャンバスなどを使用してコントロールを適切な場所に配置する必要があります。

考え?

助けてくれてありがとう。

アップデート

カスタム行を残りの行と一緒にスクロールさせたくない場合に、この問題を修正するために使用できるコントロールを別のコントロールの下に固定することについても質問しました (そして最終的に回答しました)。別のデータグリッドヘッダー行に合計を表示し、他の行の上に浮かせたいと思っていました)。

Silverlight で 1 つのコントロールを別のコントロールの下に固定するにはどうすればよいですか?

4

3 に答える 3

6

私は昨夜、ひらめきの中で問題を解決しました。他の誰もこの質問に投票していないことに気付いたので、この回答は誰にとっても役に立たないかもしれませんが、念のためです。

まず、カスタム行コントロールとRowsPresenterを2行のグリッドに組み合わせ、各行のサイズをAutoにしました。次に、グリッドをScrollViewer内に配置し、スクロールビューアの行のサイズをスターサイズに変更しました。RowsPresenterをスクロールするだけなので、VerticalScrollbarテンプレートパーツをテンプレートに追加しませんでした。

これにより、行が追加され、カスタム行が最後のデータ行の下部に固定されたままになる場所で探していた正確な動作が得られました。行とカスタム行が表示領域の端からオーバーフローすると、スクロールバーが表示され、ヘッダーを所定の位置に固定したままスクロールできるようになります。

仕事は終わりました。誰かがこれがお役に立てば幸いです。以下は私のControlTemplateXAMLです。

<ControlTemplate TargetType="swcd:DataGrid" x:Key="DataGridTemplate">
    <Border
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness}">

        <Grid Name="Root" Background="{TemplateBinding Background}">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <swcdp:DataGridColumnHeader Name="TopLeftCornerHeader" Grid.Column="0"/>
            <swcdp:DataGridColumnHeadersPresenter Name="ColumnHeadersPresenter" Grid.Column="1"/>
            <swcdp:DataGridColumnHeader Name="TopRightCornerHeader" Grid.Column="2"/>

            <ScrollViewer
                Grid.Row="1"
                Grid.Column="1"
                Grid.ColumnSpan="1"
                Padding="0,0,0,0"
                BorderThickness="0,0,0,0"
                VerticalScrollBarVisibility="Auto">
                <Grid >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>

                    <swcdp:DataGridRowsPresenter Name="RowsPresenter" Grid.Row="0" />

                    <Border
                        Margin="1,1,1,1"
                        Padding="2,2,2,2"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        Grid.Row="1">
                        <Grid Background="{TemplateBinding Background}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>

                            <TextBlock
                                Grid.Row="0"
                                TextAlignment="Left"
                                TextWrapping="NoWrap"
                                Text="Add a new item using the lists below:" />

                            <mystuff:MySelectionControl
                                HorizontalContentAlignment="Stretch"
                                Grid.Row="1"
                                SelectionChanged="OnSelectionChanged"/>
                        </Grid>
                    </Border>
                </Grid>
            </ScrollViewer>

            <Rectangle Name="BottomLeftCorner" Grid.Row="3" Grid.ColumnSpan="2" />
            <Grid Grid.Column="1" Grid.Row="3">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Rectangle Name="FrozenColumnScrollBarSpacer" />
                <ScrollBar Name="HorizontalScrollbar" Grid.Column="1" Orientation="Horizontal" Height="18" />
            </Grid>
            <Rectangle Name="BottomRightCorner" Grid.Column="2" Grid.Row="3" />
        </Grid>
    </Border>
</ControlTemplate>
于 2009-02-05T15:11:03.530 に答える
2

これが Silverlight に役立つかどうかはわかりませんが、IsTotal という非表示の列を追加して、合計行を WPF DataGrid に追加しました。カスタムのグループ化/並べ替えを使用して、この行を常にグリッドの一番下に表示することができました。グループ化/並べ替え順序は、この列をプライマリ 並べ替えとして使用するように構成されており、方向は固定されています。うまくいくようです。

于 2009-10-21T08:50:03.767 に答える