2014-03-03 60 views
0

我想修复由以前的同事编写的更大的代码块 - 它是某种报告系统,输出是一个包含数据的表。我的任务是在滚动时冻结列顶部的顶部。由于我是新来这个,我做了很简单的表,找出如何DataGrid的作品:在没有ScrollViewer的情况下在StackPanel中垂直滚动

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中,或者如何启用垂直滚动StackPanel而不使用scrollViewer? (另一个可能的解决方案可能是缩短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="&lt;&lt;" Click="PageButtonClick" Opacity="0.75"/> 
      <Button Height="23" Name="PrevButton" Width="40" Click="PageButtonClick" Opacity="0.75" Content="&lt;"/> 
      <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> 

在此先感谢。

+1

取代取代你必须把DataGrid的一个StackPanel里面? DataGrid具有内置滚动支持,但由于StackPanel具有无限的垂直空间,因此无法在StackPanel中使用它。也许你可以向我们展示一些XAML? –

+0

还要确保DataGrid未包含在滚动查看器中。 (DataGrid的默认模板实际上是一个荣耀的ScrollViewer) – Dtex

+0

我放了一点XAML。它没有被包裹在scrollviewer那里,只是stackpanel。不过,有这些按钮包裹在堆叠面板中,所以我想我不能只是删除stackapnel以及 – Asheara

回答

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

+0

好。请将您自己的答案标记为“答案”,让其他人知道这个问题已经解决。 –

相关问题