首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGrid RowDetailsTemplate涡旋

DataGrid RowDetailsTemplate涡旋
EN

Stack Overflow用户
提问于 2014-05-07 17:17:52
回答 5查看 4.5K关注 0票数 4
代码语言:javascript
复制
<DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=test}"></DataGridTextColumn>
  </DataGrid.Columns>
  <DataGrid.RowDetailsTemplate>
    <DataTemplate>
     <DataGrid Template="{DynamicResource TemplateDataGridPrintAndExport}"/>
    </DataTemplate>
  </DataGrid.RowDetailsTemplate>
 <DataGrid/>

我有一个像上面那样的数据。Datgrid的行详细信息模板还包含一个数据集。当单击父列时,将填充内部数据。我的问题是:如果实现了行细节模板数据集,并且用户鼠标在上面盘旋,而滚动父数据集则不起作用。用户应将鼠标悬停到要滚动的主数据to上。然而,它并不是用户友好的。我怎样才能防止这样的内心暴躁行为呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-10-14 08:46:32

我通过尝试其他方法找到了灵魂:

代码语言:javascript
复制
<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/>

解决方案是将ScrollViewer.CanContentScroll="False"属性赋予外部数据网格,将IsReadOnly="True" ScrollViewer.CanContentScroll="False" IsEnabled="False"属性赋予内部数据网格。现在,它正在顺利地滚动,并与父数据集相关联。

票数 8
EN

Stack Overflow用户

发布于 2018-09-28 10:27:26

我想提出两种备选解决办法,因为所选择的办法具有严重的副作用。其中之一被改善-你失去了与嵌套DataGrid及其子控件交互的能力。第二,控制者在残疾状态下的外观变化。

  1. 在osmanraifgunes溶液中将IsReadOnly="True"改为IsHitTestVisible="False"。这将修复外观副作用,但您仍然无法与内部控件交互(使用鼠标)。代码:

  1. PreviewMouseWheel中捕获RowDetailsTemplate控件中的隧道事件,并将其作为冒泡事件传递给父事件。这将有效地使RowDetailsTemplate中的控件只对鼠标滚动视而不见,并允许上面的控件在可视树中任意处理它。xaml:

代码背后:

代码语言:javascript
复制
        private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            if (e.Handled)
            {
                return;
            }
            Control control = sender as Control;
            if(control == null)
            {
                return;
            }
            e.Handled = true;
            var wheelArgs = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
            {
                RoutedEvent = MouseWheelEvent,
                Source = control
            };
            var parent = control.Parent as UIElement;
            parent?.RaiseEvent(wheelArgs);
        }
票数 5
EN

Stack Overflow用户

发布于 2020-01-28 08:17:45

如果您使用的是.NET 4.5及以上版本,您可以在外部网格上使用VirtualizingPanel.ScrollUnit="Pixel",这将允许您按像素滚动,而不是按单位(项)滚动,因为当大的内部DataGrid开始跳跃时,这会导致相当奇怪的行为。

然后,您可以使用内部PreviewMouseWheel事件将滚动事件传递给父事件,因为它是由内部控件捕获的。

Xaml:

代码语言:javascript
复制
<DataGrid VirtualizingPanel.ScrollUnit="Pixel">
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <DataGrid PreviewMouseWheel="DataGrid_PreviewMouseWheel"/>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

政务司司长:

代码语言:javascript
复制
private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    e.Handled = true;
    var parent = ((Control)sender).Parent as UIElement;
    parent?.RaiseEvent(new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
    {
        RoutedEvent = MouseWheelEvent,
        Source = sender
    });
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23524192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档