簡體   English   中英

ScrollViewer 中的 WPF DataGrid

[英]WPF DataGrid inside a ScrollViewer

我有一個StackPanel ,帶有一個 header 控件和一個Scrollviewer內的DataGrid 像這樣:

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

scoll 行為應滿足以下要求:

  • 在鼠標懸停時滾動DataGrid應滾動外部ScrollViewer
  • header 控件(由Canvas表示)由ScollViewer滾動。

  • DataGrid底部的水平滾動條應隨時保留在屏幕上。

  • 水平滾動條不應滾動 header 控件,只能滾動DataGrid

我嘗試了DataGrid.ScrollViewer的各種設置,但都沒有達到預期的效果,將StackPanel更改為WrapPanel甚至Grid也沒有任何幫助。

這可能嗎? 感謝您提供任何幫助和閱讀資源。

我也一直在努力解決您的第一個問題 - 讓內部 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);
}

希望這可以幫助!

這是一個非常復雜的問題,它可能需要一個人周才能完成:但這是一個解決一半問題的開始:

<ScrollViewer x:Name="scroll">
    <DataGrid x:Name="dataGrid">
        <DataGrid.Template>
            <ControlTemplate>
                <StackPanel Orientation="Vertical">
                    <Canvas x:Name="header" Height="300" />
                    <ItemsPresenter/>
                </StackPanel>
            </ControlTemplate>
        </DataGrid.Template>
    </DataGrid>
</ScrollViewer>

如果您將 canvas 放在數據網格的模板中,它會將其視為數據網格的一部分,因此 canvas 和數據網格將作為一個滾動。

顯然,datagrid 模板將是空白的,不顯示任何標題。 因此,您需要從頭開始重寫它。 為此,您可以使用默認源代碼

要查找模板,只需在給定鏈接中搜索<ControlTemplate TargetType="{x:Type DataGrid}">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM