【发布时间】:2014-03-03 14:26:23
【问题描述】:
我正在尝试修复以前同事编写的一大段代码——它是某种报告系统,输出是一个包含数据的表格。我的任务是在滚动时冻结列标题。由于我是新手,所以我制作了一个非常简单的表格,以了解 datagrid 的工作原理:
public MainWindow()
{
this.InitializeComponent();
var dt = new DataTable();
dt.Columns.Add("prvni");
dt.Columns.Add("druhy");
for (int i = 0; i < 100; i++)
{
var row = dt.NewRow();
row[0] = "A" + i;
row[1] = "B" + i;
dt.Rows.Add(row);
}
this.MainGrid.ItemsSource = dt.AsDataView();
}
通过大量搜索,我发现了很多主题,建议摆脱 ScrollViewer,因为默认情况下冻结的标题在 datagrid 中。这是我修改的原始代码部分:
var scrollViewer = new ScrollViewer()
{
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
VerticalScrollBarVisibility = ScrollBarVisibility.Auto
};
scrollViewer.AddHandler(UIElement.MouseWheelEvent, new RoutedEventHandler(this.MouseWheelHandler), true);
var stackPanel = new StackPanel();
scrollViewer.Content = stackPanel;
...
return scrollViewer;
在另一个函数中,它被用作/调用:
var reportInfo = ((((sender as DataGrid).Parent as StackPanel).Parent as ScrollViewer).Parent as ReportOutputTabItem).Tag as ReportInfo;
嗯 - 我删除了滚动查看器,并将其作为 StackPanel 返回,但是 - 现在我根本无法滚动。当我搜索问题时,如何将垂直滚动添加到 StackPanel,答案是“添加 ScrollViewer”。
那么 - 有没有办法让列标题在 ScrollViewer 中冻结,或者如何在不使用 scrollViewer 的情况下在 StackPanel 中启用垂直滚动? (另一种可能的解决方案可能是使 StackPanel 的垂直大小更短一些,因为结果大多是页面,但仍然需要整页滚动一点)。
XAML 部分:
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TabControl Name="MainTab" SelectionChanged="MainTabSelectionChanged" ItemTemplate="{StaticResource ClosableTabItemTemplate}"/>
<StackPanel Grid.Row="1" Name="NavigationPanel" Orientation="Horizontal" HorizontalAlignment="Center">
<Button Height="23" Name="FirstButton" Width="40" Content="<<" Click="PageButtonClick" Opacity="0.75"/>
<Button Height="23" Name="PrevButton" Width="40" Click="PageButtonClick" Opacity="0.75" Content="<"/>
<Label Height="23" Name="PageNumberLabel" Width="70" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="1/1"/>
<Button Height="23" Name="NextButton" Width="40" Content=">" Click="PageButtonClick" Opacity="0.75"/>
<Button Height="23" Name="LastButton" Width="40" Click="PageButtonClick" Opacity="0.75" Content=">>"/>
</StackPanel>
提前致谢。
【问题讨论】:
-
您必须将 DataGrid 放在 StackPanel 中吗? DataGrid 具有内置的滚动支持,但由于 StackPanel 具有无限的垂直空间,因此您不能在 StackPanel 中使用它。也许您可以向我们展示一些 XAML?
-
还要确保 DataGrid 没有包含在滚动查看器中。 (DataGrid的默认模板其实就是一个美化的ScrollViewer)
-
我放了一点 XAML。它没有被包裹在滚动查看器中,只是堆栈面板。但是,这些按钮包含在 stackpanel 中,所以我想我不能只删除 stackapnel
标签: c# wpf datagrid scrollviewer stackpanel