2014-03-03 59 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

好。請將您自己的答案標記爲「答案」,讓其他人知道這個問題已經解決。 –

相關問題