StackPanel中没有ScrollViewer的垂直滚动

时间:2014-03-03 14:26:24

标签: c# wpf 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中使列标题冻结,或者如何在不使用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="&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 个答案:

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