c# - 如何在 Silverlight 中的 DataGrid 末尾包含自定义行?

标签 c# xaml datagrid silverlight-2.0 controltemplates

我的 Silverlight 应用程序中有一个 DataGrid,它运行良好,在我操作 ItemsSource 集合时添加一行或删除一行。但是,我希望有一个额外的行或始终出现在最后一个数据行之后的控件。

我可以使用 ControlTemplate 并将 RowsPresenter 行设置为自动高度,让附加控件出现在最后一行之后,但这意味着当渲染区域变得太小时,行永远不会滚动。但是,如果我将 RowsPresenter 行高更改为星形,行会滚动,但附加控件似乎固定在数据网格的底部,而不是最后一行的底部。

有没有一种方法可以让 RowsPresenter 上的星号高度行为同时仍让我的控件以我想要的方式显示?

我目前的想法是,我需要以某种方式使用 LoadingRow 事件来找到最后一行的位置,并使用 Canvas 或类似工具将我的控件放置在适当的位置。

想法?

在此先感谢您的帮助。

更新

我还问了一个关于将一个控件固定在另一个控件下方的问题(并最终得到了回答),如果您不希望自定义行与其余行一起滚动(例如在我的在这种情况下,我想要另一个数据网格标题行来显示总计并 float 在其他行上)。

How do I pin one control below another in Silverlight?

最佳答案

我昨晚灵机一动解决了我的问题。我注意到没有其他人对这个问题投票,所以这个答案可能对任何人都没有帮助,但以防万一。

首先,我将我的自定义行控件和 RowsPresenter 组合在一个由两行组成的网格中,每行的大小设置为自动。然后我将网格放在 ScrollViewer 中,然后将滚动查看器行的大小调整为星形。我没有将 VerticalScrollbar 模板部分添加到我的模板中,因为这只会滚动 RowsPresenter。

这给了我我正在寻找的确切行为,其中添加了一行并且自定义行仍然固定在最后一个数据行的底部。当行和自定义行溢出可见区域的末尾时,滚动条会出现以允许滚动,同时保持标题固定在适当的位置。

工作完成。我希望有人觉得这有帮助。下面是我的 ControlTemplate XAML。

<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>

关于c# - 如何在 Silverlight 中的 DataGrid 末尾包含自定义行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512644/

相关文章:

c# - 使用 SelectionMode Multiple/Extended 跨多个嵌套列表框获取所有选定项

c# - 禁用 DataGrid 中的特定单元格编辑

WPFToolkit 数据网格 : Combobox column does not update selectedvaluebinding immediately

sorting - 在应用程序的 creationComplete (Flex 4.5) 上设置 Spark DataGrid 列的默认排序

c# - 您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,以了解在附近使用的正确语法

c# - 如何找出以编程方式构建 dll 的 .net 运行时?

c# - 如何使用 StringFormat 舍入绑定(bind)的 double 值

c# - 在 WinRT 中从代码隐藏激活底部 AppBar

c# - 如何返回 C# 类文件路径

c# - 从JSON返回的字符串中删除双引号