【问题标题】:Datagrid nested inside another datagrid's RowDetailsTemplate breaks mouse wheel scrolling嵌套在另一个数据网格 RowDetailsTemplate 中的数据网格中断了鼠标滚轮滚动
【发布时间】:2010-06-02 14:25:31
【问题描述】:

我在另一个 DataGrid 的 RowDetailsTemplate 中“嵌套”了一个 DataGrid。每当我的鼠标在父 DataGrid 上的行的主要部分上时滚动工作正常,但是当鼠标在嵌套在 RowDetailsTemplate 内的 DataGrid 上时,它会停止滚动。

这是 DataGrid 设置:

<my:DataGrid Margin="-2,36,-2,1" 
                         Background="White" 
                         CanUserReorderColumns="True" 
                         CanUserResizeRows="False" 
                         ColumnHeaderHeight="35" 
                         HorizontalGridLinesBrush="LightGray" 
                         VerticalGridLinesBrush="White" 
                         x:Name="testList" 
                         VerticalScrollBarVisibility="Visible" 
                         FlowDirection="LeftToRight" 
                         AutoGenerateColumns="False" 
                         IsReadOnly="True" 
                         ScrollViewer.CanContentScroll="False" 
                         SelectionMode="Single" 
                         HeadersVisibility="Column" 
                         GridLinesVisibility="None"
                         >

                <my:DataGrid.Columns>

                    <my:DataGridTemplateColumn MinWidth="60" CanUserSort="True" SortMemberPath="ResultType">
                        <my:DataGridTemplateColumn.Header>
                            <TextBlock FontSize="14" Text="Result"></TextBlock>
                        </my:DataGridTemplateColumn.Header>
                        <my:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Grid Margin="4" VerticalAlignment="Center" HorizontalAlignment="Center">
                                    <Image Height="35" Width="35" Source="{Binding TestResultImage}" ToolTip="{Binding ResultType}" />
                                </Grid>
                            </DataTemplate>
                        </my:DataGridTemplateColumn.CellTemplate>
                    </my:DataGridTemplateColumn>

                    <my:DataGridTemplateColumn MinWidth="100" CanUserSort="True" SortMemberPath="TestName">
                        <my:DataGridTemplateColumn.Header>
                            <TextBlock Margin="3" FontSize="14" Text="Dates"></TextBlock>
                        </my:DataGridTemplateColumn.Header>
                        <my:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Grid Margin="5" VerticalAlignment="Center" HorizontalAlignment="Center">
                                    <TextBlock FontSize="14" TextWrapping="Wrap" AllowDrop="True" Text="{Binding TestName}" ToolTip="This test analyzed data from this date" />
                                </Grid>
                            </DataTemplate>
                        </my:DataGridTemplateColumn.CellTemplate>
                    </my:DataGridTemplateColumn>

                    <my:DataGridTemplateColumn MinWidth="150" Width="*" CanUserSort="True" x:Name="TestDetails" SortMemberPath="Result">
                        <my:DataGridTemplateColumn.Header>
                            <TextBlock Margin="4" FontSize="14" Text="Details"></TextBlock>
                        </my:DataGridTemplateColumn.Header>
                        <my:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Grid Margin="5" VerticalAlignment="Center">
                                    <TextBlock TextWrapping="Wrap" FontSize="13" Text="{Binding Result}" ToolTip="Click for more details about this test" />
                                </Grid>
                            </DataTemplate>
                        </my:DataGridTemplateColumn.CellTemplate>
                    </my:DataGridTemplateColumn>

                </my:DataGrid.Columns>

                <my:DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <Grid>
                        <my:DataGrid Background="White"
                                     BorderThickness="0" 
                                     CanUserReorderColumns="True" 
                                     HeadersVisibility="Column" 
                                     CanUserResizeRows="False" 
                                     ColumnHeaderHeight="25" 
                                     ItemsSource="{Binding GuiValidatorResults}" 
                                     HorizontalGridLinesBrush="LightGray" 
                                     x:Name="validatorList" 
                                     VerticalGridLinesBrush="White" 
                                     VerticalScrollBarVisibility="Auto" 
                                     HorizontalScrollBarVisibility="Auto" 
                                     FlowDirection="LeftToRight" 
                                     AutoGenerateColumns="False" 
                                     IsReadOnly="True" 
                                     ScrollViewer.CanContentScroll="False" 
                                     ScrollViewer.ScrollChanged=""
                                     SelectionMode="Single" 
                                     MouseDoubleClick="HideAllValidatorDetails"
                                     GridLinesVisibility="Horizontal">
                            <my:DataGrid.Columns>

                                <my:DataGridTemplateColumn MinWidth="60" CanUserSort="True" SortMemberPath="ResultType">
                                    <my:DataGridTemplateColumn.Header>
                                        <TextBlock Margin="0" Text="Result"></TextBlock>
                                    </my:DataGridTemplateColumn.Header>
                                    <my:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Grid Margin="0">
                                                <Image Height="25" Width="25" Source="{Binding ValidatorResultImage}" ToolTip="{Binding ResultType}" />
                                            </Grid>
                                        </DataTemplate>
                                    </my:DataGridTemplateColumn.CellTemplate>
                                </my:DataGridTemplateColumn>

                                <my:DataGridTemplateColumn MinWidth="100" CanUserSort="True" SortMemberPath="DescriptiveTestLabel">
                                    <my:DataGridTemplateColumn.Header>
                                        <TextBlock Margin="0" Text="Validator"></TextBlock>
                                    </my:DataGridTemplateColumn.Header>
                                    <my:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Grid Margin="5">
                                                <TextBlock TextWrapping="Wrap" AllowDrop="True" Text="{Binding DescriptiveTestLabel}" />
                                            </Grid>
                                        </DataTemplate>
                                    </my:DataGridTemplateColumn.CellTemplate>
                                </my:DataGridTemplateColumn>

                                <my:DataGridTemplateColumn MinWidth="150" Width="*" CanUserSort="True" SortMemberPath="Text">
                                    <my:DataGridTemplateColumn.Header>
                                        <TextBlock Margin="0" Text="Message"></TextBlock>
                                    </my:DataGridTemplateColumn.Header>
                                    <my:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Grid Margin="5">
                                                <TextBlock TextWrapping="Wrap" AllowDrop="True" Text="{Binding Text}" />
                                            </Grid>
                                        </DataTemplate>
                                    </my:DataGridTemplateColumn.CellTemplate>
                                </my:DataGridTemplateColumn>

                            </my:DataGrid.Columns>

                            <my:DataGrid.RowDetailsTemplate>
                                <DataTemplate>
                                            <GroupBox FontWeight="Bold" Margin="5" Header="Additional Details:">
                                        <Grid Margin="5" x:Name="WidthSetter">
                                            <Grid.RowDefinitions>
                                                <RowDefinition />
                                                <RowDefinition />
                                            </Grid.RowDefinitions>
                                            <Grid.Resources>
                                                <DataTemplate x:Key="AdditionalDetailsTemplate">
                                                    <Grid>
                                                        <DockPanel>
                                                            <TextBlock HorizontalAlignment="Left" Margin="0,0,0,10" Text="{Binding Path=.}" TextWrapping="Wrap" />
                                                        </DockPanel>
                                                    </Grid>
                                                </DataTemplate>
                                            </Grid.Resources>
                                            <ListView FontWeight="Normal" 
                                                      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                                                      HorizontalContentAlignment="Stretch" 
                                                      BorderThickness="0" 
                                                      HorizontalAlignment="Left" 
                                                      Margin="0" 
                                                      Width="{Binding ActualWidth, ElementName=WidthSetter}" ItemTemplate="{StaticResource AdditionalDetailsTemplate}" ItemsSource="{Binding Path=AdditionalDetails}" />

                                            <Grid Grid.Row="1" Margin="3,5,5,5">

                                                <Grid.RowDefinitions>
                                                    <RowDefinition />
                                                    <RowDefinition />
                                                </Grid.RowDefinitions>
                                                <TextBlock FontWeight="Bold" Text="Records involved:" />
                                                <ListView BorderThickness="0" ItemsSource="{Binding InvolvedRecords}" ItemTemplate="{StaticResource ValidatorInvolvedRecordsTemplate}" Grid.Row="1" />
                                            </Grid>
                                        </Grid>
                                    </GroupBox>
                                </DataTemplate>
                            </my:DataGrid.RowDetailsTemplate>
                        </my:DataGrid>
                        </Grid>
                    </DataTemplate>
                </my:DataGrid.RowDetailsTemplate>

            </my:DataGrid>

我认为有某种方法可以告诉子 DataGrid 将滚动事件传递给“testList”DataGrid,但我无法弄清楚如何。

谢谢!

【问题讨论】:

  • 我知道这已经很老了,但你还记得你是否有解决方案吗?

标签: c# wpfdatagrid


【解决方案1】:

除非 RowDetails 自己处理滚动,否则请尝试将主 DataGrid 上的属性 ScrollViewer.CanContentScroll 设置为 false。

ScrollViewer.CanContentScroll="False"

【讨论】:

    【解决方案2】:

    我在别处找到了解决这个问题的方法:

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/e7c3a3b0-3b89-40a3-9160-a930724251fe/nested-datagrid-scrolling-woes?forum=wpf

    这基本上说在 CodeBehind 中使用此方法:

    private void NestedDataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            e.Handled = true;
            var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
            eventArg.RoutedEvent = UIElement.MouseWheelEvent;
            eventArg.Source = sender;
            var parent = ((Control)sender).Parent as UIElement;
            parent.RaiseEvent(eventArg);
        }
    

    并且在 xaml 中嵌套的 DataGrid 开始标记包含:

    x:Name="NestedDataGrid" PreviewMouseWheel="NestedDataGrid_PreviewMouseWheel"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2011-11-18
      • 1970-01-01
      • 2013-02-17
      相关资源
      最近更新 更多