我正在尝试修复前一位同事编写的更大的代码块 - 它是某种报表系统,输出是一个包含数据的表。我的任务是在滚动时冻结列标题。由于我是新手,我制作了非常简单的表格,以了解数据网格的工作原理:
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;
好吧 - 我删除了scrollviewer,然后将它作为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>
提前致谢。
答案 0 :(得分:0)
好吧,我终于找到了解决方法: 最初,datagrid包装在StackPanel中,然后包含在ScrollViewer中。我删除了ScrollViewer,并用Grid替换了StackPanel。
现在我有垂直滚动条和冻结列标题。
我删除了整个
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;
并替换为简单的var grid = new Grid();
并且所有stackPanel.Children.Add(dataGrid);
都替换为grid.Children.Add(dataGrid);