wpf DataGrid RowDetailsTemplate Scroll

osm*_*nes 1 wpf xaml wpfdatagrid

<DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=test}"></DataGridTextColumn>
  </DataGrid.Columns>
  <DataGrid.RowDetailsTemplate>
    <DataTemplate>
     <DataGrid Template="{DynamicResource TemplateDataGridPrintAndExport}"/>
    </DataTemplate>
  </DataGrid.RowDetailsTemplate>
 <DataGrid/>
Run Code Online (Sandbox Code Playgroud)

我有一个像上面这样的数据网格.Datgrid的行详细信息模板还包含数据网格.单击父级列时,将填充内部数据网格.我的问题是:如果行详细信息模板datagrid已完成并且用户鼠标悬停在其上,同时滚动父数据网格则滚动不起作用.用户应将鼠标悬停在主数据栏上以进行滚动.但是,它不是用户友好的.如何防止内部数据网格以这种方式运行?

osm*_*nes 6

我通过尝试替代方案找到了灵魂:

<DataGrid  ScrollViewer.CanContentScroll="False">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=test}"></DataGridTextColumn>
  </DataGrid.Columns>
  <DataGrid.RowDetailsTemplate>
    <DataTemplate>
     <DataGrid Template="{DynamicResource TemplateDataGridPrintAndExport}"  IsReadOnly="True" ScrollViewer.CanContentScroll="False"  IsEnabled="False"/>
    </DataTemplate>
  </DataGrid.RowDetailsTemplate>
 <DataGrid/>
Run Code Online (Sandbox Code Playgroud)

解决方案是 ScrollViewer.CanContentScroll="False"将外部数据网格和IsReadOnly="True" ScrollViewer.CanContentScroll="False" IsEnabled="False"属性的属性赋予内部数据网格.现在它顺利滚动并符合父数据网格.


小智 5

我想提出两种替代解决方案,因为所选择的一种具有严重的副作用。Kaizen 提到了其中之一 - 您失去了与嵌套 DataGrid 及其子控件交互的能力。第二个是控件在禁用状态下的外观变化。

  1. 更改IsReadOnly="True"IsHitTestVisible="False"osmanraifgunes 的解决方案。这将修复外观副作用,但您仍然无法与内部控件交互(使用鼠标)。代码:

    <DataGrid ScrollViewer.CanContentScroll="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=test}" />
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid
                    IsHitTestVisible="False"
                    ScrollViewer.CanContentScroll="False"
                    Template="{DynamicResource TemplateDataGridPrintAndExport}" />
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>
    
    Run Code Online (Sandbox Code Playgroud)
  2. PreviewMouseWheel在控件中捕获隧道事件RowDetailsTemplate并将其作为冒泡事件传回父级。这将有效地使RowDetailsTemplate盲区中的控件仅对鼠标滚动进行控制,并允许可视化树中的上方控件随心所欲地处理它。xml:

    <DataGrid ScrollViewer.CanContentScroll="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=test}" />
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid
                    PreviewMouseWheel="DataGrid_PreviewMouseWheel"
                    Template="{DynamicResource TemplateDataGridPrintAndExport}" />
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>
    
    Run Code Online (Sandbox Code Playgroud)

后面的代码:

<DataGrid ScrollViewer.CanContentScroll="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=test}" />
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <DataGrid
                IsHitTestVisible="False"
                ScrollViewer.CanContentScroll="False"
                Template="{DynamicResource TemplateDataGridPrintAndExport}" />
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

  • 我已经对您的第二个解决方案进行了快速修复,该解决方案似乎对我来说效果更好。请随意[检查一下。](/sf/answers/4436345651/) (2认同)