我的Silverlight应用程序中有一个DataGrid
,它工作得很好,在操作ItemsSource
集合时添加一行或删除一行。但是,我希望有一个额外的行,或总是显示在最后一个数据行之后的控件。
我可以使用ControlTemplate
将RowsPresenter行设置为“自动”高度,使附加控件显示在最后一行之后,但这意味着当渲染区域变得太小时,行将永远不会滚动。但是,如果我将RowsPresenter行高更改为Star,则行会滚动,但其他控件将显示固定在数据网格的底部,而不是最后一行的底部。
有没有一种方法可以使RowsPresenter上具有Star Height行为,同时仍然让控件以我想要的方式出现?
我目前的想法是,我需要以某种方式使用LoadingRow事件找到最后一行的位置,并使用Canvas或类似的控件将控件放置在适当的位置。
有什么想法吗?
先谢谢您的帮助。
更新
我还问了一个关于将一个控件固定在另一个控件下的问题(并最终得到了回答),如果您不希望自定义行与其余行一起滚动(例如在我的情况下,我想要另一个datagrid header 行显示总计,并在其他行上 float )。
How do I pin one control below another in Silverlight?
最佳答案
昨晚我一连串的灵感解决了我的问题。我注意到没有人投票赞成这个问题,所以这个答案可能对任何人都没有帮助,但以防万一。
首先,我将自定义行控件和RowsPresenter合并为两行的网格,每行的大小均设置为“自动”。然后,我将网格放置在ScrollViewer中,然后将滚动查看器行的大小调整为Star大小。我没有将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/