我们谈论最多两分钟来渲染一个窗口。该窗口包含一个Grid内的DataGrid,连接到一个最多包含1000个元素的DataTable。 我手动设置DG的高度和宽度,手动设置网格的行高,数据网格中的每一列都设置了手动宽度。
从DB获取数据并创建数据表需要最多300毫秒,但渲染它需要花费大量时间。
我尝试过虚拟化,差异很小,在程序的正常使用中几乎不可察觉。
我的问题是,如果我设置所有内容的高度和宽度,当我进入诊断会话时,它会说“对此元素进行了更改,需要计算此元素的大小和/或位置” 。每个DataGridRow最多需要200毫秒,我发现它相当慢。
我正在使用TemplateDataColumn,因为我实际上需要使用扩展正常文本框的文本框。
任何想法都非常受欢迎,我已经打了大约两个星期了,而且我的想法已经用完了。
我们在服务器上运行它,我试图让它在本地工作但是看看IBM似乎无法构建一个有效的设置,以便我轻松地安装DB2驱动程序来设置Windows DSN,我无法使用GPU在本地测试它,看它是否有助于渲染过程。
感谢您的时间和关注。
编辑:根据请求添加了数据网格代码。
虽然这个DG相当复杂,但渲染时间问题不仅限于此。
<av:DataGrid BorderThickness="0" Height="550" x:Name="dgLineasPresupuesto" AutoGenerateColumns="False" Width="1125"
SelectionChanged="Refresh" SelectionMode="Single" VerticalGridLinesBrush="Transparent" CanUserAddRows="False" PreviewKeyDown="MyPreviewKeyDown"
AlternationCount="1" AlternatingRowBackground="#444D58" RowHeaderWidth="0" IsReadOnly="true" IsEnabled="True" GotFocus="dgPresupu_GotFocus"
ItemsSource="{av:Binding}" EnableRowVirtualization="False" EnableColumnVirtualization="False" VirtualizingPanel.IsVirtualizingWhenGrouping="True" >
<av:DataGrid.Resources>
<Style TargetType="DataGridRow">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DarkGray"/>
</Style.Resources>
</Style>
<av:SolidColorBrush x:Key="{x:Static av:SystemColors.HighlightBrushKey}" Color="#526885" />
<av:Style TargetType="{x:Type av:DataGridCell}" x:Key="Celda" >
<av:Style.Triggers>
<av:Trigger Property="IsSelected" Value="True">
<av:Setter Property="Foreground" Value="Black" />
</av:Trigger>
</av:Style.Triggers>
</av:Style>
<av:Style TargetType="{x:Type av:DataGridColumnHeader}">
<av:Setter Property="Background" Value="Transparent" />
<av:Setter Property="BorderBrush" Value="Transparent" />
<av:Setter Property="BorderThickness" Value="1,1,1,1" />
<av:Setter Property="HorizontalContentAlignment" Value="Center" />
</av:Style>
<av:Style TargetType="{x:Type av:TextBox}">
<av:Setter Property="BorderThickness" Value="0"/>
<av:Setter Property="Background" Value="Transparent"/>
<av:Setter Property="Foreground" Value="White"/>
</av:Style>
<av:Style TargetType="{x:Type jaime:TextBoxNum}">
<av:Setter Property="BorderThickness" Value="0"/>
<av:Setter Property="Background" Value="Transparent"/>
<av:Setter Property="Foreground" Value="White"/>
</av:Style>
<av:Style TargetType="{x:Type andrei:TextBoxFecha}">
<av:Setter Property="BorderThickness" Value="0"/>
<av:Setter Property="Background" Value="Transparent"/>
<av:Setter Property="Foreground" Value="White"/>
</av:Style>
<av:Style TargetType="{x:Type av:CheckBox}">
<av:Setter Property="BorderThickness" Value="0"/>
<av:Setter Property="Background" Value="white"/>
<av:Setter Property="Foreground" Value="Black"/>
</av:Style>
</av:DataGrid.Resources>
<av:DataGrid.Background>
<av:StaticResource ResourceKey="tertiary_Dark"/>
</av:DataGrid.Background>
<av:DataGrid.HorizontalGridLinesBrush>
<av:StaticResource ResourceKey="text_dark"/>
</av:DataGrid.HorizontalGridLinesBrush>
<av:DataGrid.RowBackground>
<av:StaticResource ResourceKey="tertiary_Dark"/>
</av:DataGrid.RowBackground>
<av:DataGrid.Foreground>
<av:StaticResource ResourceKey="text_dark"/>
</av:DataGrid.Foreground>
<av:DataGrid.Columns>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="CodProp" Header=""
Width="20">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<av:TextBox TextAlignment="Center" HorizontalContentAlignment="Center"
IsReadOnly="True" BorderThickness="0" BorderBrush="{x:Null}" Height="20">
<av:TextBox.Style>
<av:Style TargetType="{x:Type av:TextBox}">
<av:Style.Triggers>
<av:DataTrigger Value="">
<av:DataTrigger.Binding>
<av:MultiBinding
Converter="{av:StaticResource SemaforosConverterLinPres}">
<av:Binding Path="RevLinLPre" />
<av:Binding Path="UsuRevLPre" />
</av:MultiBinding>
</av:DataTrigger.Binding>
<av:Setter Property="Background"
Value="Transparent" />
</av:DataTrigger>
<av:DataTrigger Value="Ambar">
<av:DataTrigger.Binding>
<av:MultiBinding
Converter="{av:StaticResource SemaforosConverterLinPres}">
<av:Binding Path="RevLinLPre" />
<av:Binding Path="UsuRevLPre" />
</av:MultiBinding>
</av:DataTrigger.Binding>
<av:Setter Property="Background"
Value="{av:StaticResource semaforoIosAmarillo}" />
<av:Setter Property="ToolTip" Value="Genérico"/>
</av:DataTrigger>
<av:DataTrigger Value="Rojo">
<av:DataTrigger.Binding>
<av:MultiBinding
Converter="{av:StaticResource SemaforosConverterLinPres}">
<av:Binding Path="RevLinLPre" />
<av:Binding Path="UsuRevLPre" />
</av:MultiBinding>
</av:DataTrigger.Binding>
<av:Setter Property="Background"
Value="{av:StaticResource semaforoIosRojo}" />
<av:Setter Property="ToolTip" Value="Obsoleto"/>
</av:DataTrigger>
</av:Style.Triggers>
</av:Style>
</av:TextBox.Style>
</av:TextBox>
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Lin"
Width="60" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<jaime:TextBoxNum Text="{av:Binding LinPre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="True" BorderThickness="0"
BorderBrush="{x:Null}" />
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Artículo"
Width="145" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<av:TextBox Text="{av:Binding CodArtPre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="True"
Background="Transparent" BorderThickness="0"
BorderBrush="{x:Null}" />
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Cantidad"
Width="100" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<jaime:TextBoxNum Text="{av:Binding CanLPre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
BorderBrush="{x:Null}" x:Name="CanLPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus"/>
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Precio"
Width="100" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<jaime:TextBoxNum NumDec="2" Text="{av:Binding PrePre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
BorderBrush="{x:Null}" x:Name="PrePre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus" TextChanged="tb_Change" />
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Uds./Pre."
Width="80" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<jaime:TextBoxNum Text="{av:Binding UdsPre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
BorderBrush="{x:Null}" x:Name="UdsPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus"/>
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Dto1"
Width="80" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<jaime:TextBoxNum NumDec="2" Desc="True" Text="{av:Binding Dto1LPre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
BorderBrush="{x:Null}" x:Name="Dto1LPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus" TextChanged="tb_Change"/>
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Dto2"
Width="80" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<jaime:TextBoxNum NumDec="2" Desc="True" Text="{av:Binding Dto2LPre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
BorderBrush="{x:Null}" x:Name="Dto2LPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus" TextChanged="tb_Change"/>
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Dto3"
Width="80" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<jaime:TextBoxNum NumDec="2" Desc="True" Text="{av:Binding Dto3LPre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
BorderBrush="{x:Null}" x:Name="Dto3LPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus" TextChanged="tb_Change"/>
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Importe"
Width="100" CellStyle="{av:StaticResource Celda}">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<av:TextBox Text="{av:Binding ImpLPre}" TextAlignment="Center"
HorizontalContentAlignment="Center" IsReadOnly="True"
Background="Transparent" BorderThickness="0"
BorderBrush="{x:Null}" />
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn Header="P" Width="60">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<av:CheckBox
IsChecked="{av:Binding ConProLPre, Converter={av:StaticResource CheckboxConverter}}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn Header="U" Width="60">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<av:CheckBox IsChecked="{av:Binding ConUsrLPre, Converter={av:StaticResource CheckboxConverter}}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn Header="N" Width="60">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<av:CheckBox
IsChecked="{av:Binding NetLPre, Converter={av:StaticResource CheckboxConverter}}"
HorizontalAlignment="Center"
VerticalAlignment="Center" Checked="checkNeto" Unchecked="uncheckNeto"/>
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn Header="E" Width="60">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<av:CheckBox
IsChecked="{av:Binding EspLPre, Converter={av:StaticResource CheckboxConverter}}"
HorizontalAlignment="Center"
VerticalAlignment="Center" Checked="checkExpecial" Unchecked="uncheckEspecial"/>
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
<av:DataGridTemplateColumn Header="R" Width="60">
<av:DataGridTemplateColumn.CellTemplate>
<av:DataTemplate>
<av:CheckBox
IsChecked="{av:Binding RevLinLPre, Converter={av:StaticResource CheckboxConverter}}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</av:DataTemplate>
</av:DataGridTemplateColumn.CellTemplate>
</av:DataGridTemplateColumn>
</av:DataGrid.Columns>
</av:DataGrid>