【问题标题】:Vertical scrolling in StackPanel without ScrollViewer没有 ScrollViewer 的 StackPanel 中的垂直滚动
【发布时间】: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="&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>

提前致谢。

【问题讨论】:

  • 您必须将 DataGrid 放在 StackPanel 中吗? DataGrid 具有内置的滚动支持,但由于 StackPanel 具有无限的垂直空间,因此您不能在 StackPanel 中使用它。也许您可以向我们展示一些 XAML?
  • 还要确保 DataGrid 没有包含在滚动查看器中。 (DataGrid的默认模板其实就是一个美化的ScrollViewer)
  • 我放了一点 XAML。它没有被包裹在滚动查看器中,只是堆栈面板。但是,这些按钮包含在 stackpanel 中,所以我想我不能只删除 stackapnel

标签: c# wpf datagrid scrollviewer stackpanel


【解决方案1】:

好吧,我终于找到了解决方案: 最初,数据网格被包裹在 StackPanel 中,然后被包裹在 ScrollViewer 中。我删除了 ScrollViewer,并将 StackPanel 替换为 Grid。

现在我有两个垂直滚动条和冻结列标题。

我删除了整个

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

【讨论】:

  • 好。请将您自己的答案标记为“答案”,让其他人知道这个问题已经解决。
猜你喜欢
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多