首页 > 解决方案 > ScrollViewer 中的 WPF DataGrid

问题描述

我有一个StackPanel带有标题控件和一个DataGridInside a Scrollviewer; 像这样:

<ScrollViewer>
    <StackPanel Orientation="Vertical">
        <Canvas x:Name="header" 
                Height="300" />
        <DataGrid x:Name="dataGrid">
        </DataGrid>
    </StackPanel>
</ScrollViewer>

scoll 行为应满足以下要求:

我尝试了各种设置,DataGrid.ScrollViewer但都没有达到预期的效果,更改StackPanel为 aWrapPanel甚至Grid没有任何帮助。

这可能吗?感谢您提供任何帮助和阅读资源。

标签: c#wpfdatagridscrollviewer

解决方案


我也一直在努力解决您的第一个问题 - 让内部 ScrollViewer(或本例中的 DataGrid)滚动外部 ScrollViewer。但我认为我有一个非常优雅的解决方案。您必须将事件处理程序添加到 DataGrid 的 PreviewMouseWheel 事件(以及 ScrollViewer 的名称):

<ScrollViewer x:Name="scroll_viewer">
    <StackPanel Orientation="Vertical">
        <Canvas x:Name="header" 
                Height="300" />
        <DataGrid x:Name="dataGrid" PreviewMouseWheel="mousewheel">
        </DataGrid>
    </StackPanel>
</ScrollViewer>

然后是事件处理方法:

private void mousewheel(object sender, MouseWheelEventArgs e)
{
    //what we're doing here, is that we're invoking the "MouseWheel" event of the parent ScrollViewer.

    //first, we make the object with the event arguments (using the values from the current event)
    var args = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);

    //then we need to set the event that we're invoking.
    //the ScrollViewer control internally does the scrolling on MouseWheelEvent, so that's what we're going to use:
    args.RoutedEvent = ScrollViewer.MouseWheelEvent;

    //and finally, we raise the event on the parent ScrollViewer.
    scroll_viewer.RaiseEvent(args);
}

希望这可以帮助!


推荐阅读