2011-12-16 174 views
2

我有一个DataGrid,通常包含大约30行,它很少超过200.我的问题是当用户通过向上/向下箭头键浏览网格的内容时,它一直卡住(约10到40秒),然后在同一时间DataGrid无法顺利滚动

我的DataGrid

<DataGrid Name="DgInvoiceLines" KeyUp="DgInvoiceLines_KeyUp" BorderBrush="Black" 
       RowBackground="Silver" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" 
       AutoGenerateColumns="False" SelectionUnit="FullRow" SelectionMode="Extended" CanUserAddRows="True" CanUserDeleteRows="True" 
       HorizontalContentAlignment="Center" CellEditEnding="DgInvoiceLines_CellEditEnding" VerticalContentAlignment="Center" 
       PreviewKeyDown="DgInvoiceLines_PreviewKeyDown" SelectionChanged="DgInvoiceLines_SelectionChanged" 
       CurrentCellChanged="DgInvoiceLines_CurrentCellChanged" ItemsSource="{Binding}" BorderThickness="0,2,0,0" 
       EnableColumnVirtualization="False" EnableRowVirtualization="False" ScrollViewer.CanContentScroll="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Width="Auto" Header="ProductCode" Binding="{Binding ProductCode}"/> 
      <DataGridTextColumn Width="250" Header="Description" Binding="{Binding Description}" FontSize="14"/> 
      <DataGridTextColumn Width="61" Header="Inv_Quantity" Binding="{Binding Inv_Quantity}"/> 
      <DataGridTextColumn Width="63" Header="Grn_Quantity" Binding="{Binding Grn_Quantity}"/> 
      <DataGridTextColumn Width="59" Header="Inv_Price" Binding="{Binding Inv_Price}"/> 
      <DataGridTextColumn Width="61" Header="Ord_Price" Binding="{Binding Grn_Price}"/> 
      <DataGridTextColumn Width="72" Header="Inv_Total" Binding="{Binding Inv_Total}"/> 
      <DataGridTextColumn Width="74" Header="Grn_Total" Binding="{Binding Grn_Total}"/> 
      <DataGridTextColumn Width="58" Header="AnalCode" Binding="{Binding AnalCode}"/> 
      <DataGridTextColumn Width="60" Header="Vat_Rate" Binding="{Binding Vat_Rate}"/> 
      <DataGridTextColumn Width="60" Header="Vat" Binding="{Binding Vat}" IsReadOnly="True"/> 
      <DataGridTextColumn Width="Auto" Header="GrnNo" Binding="{Binding GrnNo}"/> 
      <DataGridCheckBoxColumn Width="Auto" Binding="{Binding Line_Correct}" Header="" > 
       <DataGridCheckBoxColumn.CellStyle> 
        <Style TargetType="{x:Type DataGridCell}"> 
         <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"/> 
        </Style> 
       </DataGridCheckBoxColumn.CellStyle> 
      </DataGridCheckBoxColumn> 
      <DataGridTextColumn Width="Auto" Header="Comment" Binding="{Binding Comment}"/> 
      <DataGridTextColumn Width="Auto" Header="PerP" Binding="{Binding OuterUnits}" IsReadOnly="True"/> 
     </DataGrid.Columns> 
     <DataGrid.CellStyle > 
       <Style TargetType="{x:Type DataGridCell}"> 
        <Style.Triggers> 
         <Trigger Property="IsKeyboardFocused" Value="True" > 
          <Setter Property="Background" Value="White" /> 
          <Setter Property="Foreground" Value="Black" /> 
         </Trigger> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="Foreground" Value="Black"/> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
     </DataGrid.CellStyle> 
     <DataGrid.Resources> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightSteelBlue"/> 
     </DataGrid.Resources> 
    </DataGrid> 

它不使用实体框架跳几行,该数据是一个非常繁忙的虚拟服务器上。

任何人都可以指向某处寻找解决方案或指出我的XAML中的任何问题?

编辑

我开始想,我只是试图让电网做太过分了!

+0

如果关闭每个事件并触发并启用虚拟化,会发生什么情况? – Paparazzi 2011-12-16 14:44:00

+0

它的工作原理如下 – Noelle 2011-12-16 15:50:10

+0

然后每次添加一个触发器和事件以查找违规者。 – Paparazzi 2011-12-16 16:50:56

回答

0

没有工作:

我猜测的唯一的事情就是你触发器,而你滚动单元发射。这可能会减慢滚动速度。尝试评论你的触发器,看看是否解决了滚动问题。可能不是你想要的,但那是我能看到的唯一会减慢滚动速度的东西。

我看到的唯一的其他事情是减慢WPF中数据网格的滚动速度,这是因为行内有图像。

方法2:

另一件事你可以尝试从使用一个DataGrid切换掉,只使用一个网格,以显示你的数据。几乎相同,但网格比控件轻了很多。我从来没有在WPF中使用过数据网格,但我听说它在性能上不是很好,所以我只是使用了网格。

使用网格来显示你的数据很好的例子是:http://msdn.microsoft.com/en-us/library/aa480224.aspx

0

禁用EnableRowVirtualization和EnableColumnVirtualization,你也做PreviewKeyDown =“DgInvoiceLines_PreviewKeyDown”东西

这可以在网格滚动

放缓
0

您的DataGrid在ScrollViewer?我有一个DataGrid不会虚拟化其内容的问题,因为ScrollViewer为它提供了无限的空间,然后使用它。 因此,如果是这种情况,请将其从ScrollViewer中取出。

如果您不确定其是否正确虚拟化,可以下载内存分析器程序(即ANTS),并检查性能下降时DataGrid单元的实例数量是否存在。