2013-01-03 51 views
0

我使用DataGrid來顯示存儲庫佔用情況(佔用 - 顯示圖像帶有方框,未佔用 - 顯示空圖像)。
在DataGrid中,我使用DataGridTemplateColumn來覆蓋圖像。 我的主要形式XAML代碼:使用DataGridTemplateColumn時WPF數據網格的性能

<xctk:BusyIndicator Name="ctrlBusy" IsBusy="False" BusyContent="Generating Maps..." > 
<Grid> 
    <StackPanel> 
     <Button Name="btnClick" Grid.Row="0" Click="Button_Click_1" Height="44" VerticalAlignment="Top" 
     HorizontalAlignment="Left" Width="114" Panel.ZIndex="4" Margin="6,3,0,0">Click</Button> 

     <StackPanel Orientation="Vertical" Grid.Row="1"> 
      <TextBlock Background="SkyBlue" Height="50"> 

      </TextBlock> 
      <DataGrid GridLinesVisibility="None" Background="SkyBlue" 
      BorderBrush="Transparent" IsReadOnly="True" ItemsSource="{Binding}" 
      AutoGenerateColumns="True" AutoGeneratingColumn="dgvMap_AutoGeneratingColumn" 
      CanUserAddRows="False" CanUserSortColumns="true" CanUserDeleteRows="False" 
      HeadersVisibility="Row" Name="dgvMap" SelectionMode="Single" 
      Panel.ZIndex="0" Margin="0,0,0,0" VirtualizingStackPanel.VirtualizationMode="Standard"> 
       <!--for removing the blue color bkground default for row selection--> 
       <DataGrid.Resources> 
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
      Color="Transparent"/> 
       </DataGrid.Resources> 
      </DataGrid> 
      <TextBlock Background="SkyBlue" Height="50"> 

      </TextBlock> 
     </StackPanel> 
    </StackPanel> 
</Grid> 


DataTemplate中的數據網格:

<DataTemplate x:Key="MyDataTemplate" DataType="DataRowView"> 
    <Grid Background="Transparent"> 
     <Image Tag="{Binding}" Name="Layer0" Margin="0,0,0,0" Panel.ZIndex="1" 
       Width="50" Height="50" ToolTipService.HasDropShadow="True" ToolTipService.ShowDuration="20000" ToolTipService.InitialShowDelay="200" > 
      <Image.ToolTip> 
       <StackPanel> 
        <Label FontWeight="Bold" Background="Blue" Foreground="White" Content="{Binding}" /> 
        <TextBlock Padding="10" TextWrapping="WrapWithOverflow" Width="200"> 
         This coil is located in this location. Yard Name is FG. Zone is Dispatch Area. 
        </TextBlock> 
        <Line Stroke="Black" StrokeThickness="1" X2="200" /> 
        <StackPanel Orientation="Horizontal"> 
         <Label FontWeight="Bold">Report to admin in case of coil location mismatch</Label> 
        </StackPanel> 
       </StackPanel> 
      </Image.ToolTip> 
      <Image.Resources> 
       <Style TargetType="{x:Type Image}"> 
        <Setter Property="Source" Value="{Binding Converter={StaticResource IntToImageConverter}, ConverterParameter = Layer0}" /> 
        <Style.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <!-- Hover image --> 
          <Setter Property="Cursor" Value="Hand"/> 
          <Setter Property="Source" Value="C:\Users\Coil3.png"/> 
          <!--<Setter Property="Source" Value="{Binding Converter={StaticResource HoverImage}}"/>--> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Resources> 
     </Image> 
    </Grid> 
</DataTemplate> 

主窗體的代碼隱藏:

private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     btnClick.Content = "Data Loaded"; 
     Stopwatch sw = new Stopwatch(); 
     DataTable dt = dbLayer.tblSaddleSelectAll(); 
     sw.Start(); 
     dgvMap.ItemsSource = dt.DefaultView; 
     sw.Stop(); 
     btnClick.Content = sw.ElapsedMilliseconds.ToString(); 

    } 



    private void dgvMap_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     if (e.PropertyName == "row") 
     { 
      e.Column.Visibility = System.Windows.Visibility.Hidden; 
     } 
     var column = new DataRowColumn(e.PropertyName); 
     column.Header = e.Column.Header; 
     column.CellTemplate = (DataTemplate)Resources["MyDataTemplate"]; 

     e.Column = column; 
    } 

ValueConverter的DataGrid中:

public class BoolToImageConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     ImageSource result = null; 
     var intValue = value.ToString(); 
     switch (parameter.ToString()) 
     { 
      case "Layer1": 
       if (intValue.ToUpper().Contains("EMPTY")) 
       { 
        result = null; 
       } 
       else 
       { 
        result = new BitmapImage(new Uri(@"C:\Users\Images\Box3.png")); 
       } 
       return result; 
      default: 
       if (intValue.ToUpper().Contains("EMPTY")) 
       { 
        //result = null; 
        result = new BitmapImage(new Uri(@"C:\Users\Images\Box1.png")); 
       } 
       else 
       { 

        result = new BitmapImage(new Uri(@"C:\Users\Images\Box2.png")); 
       } 
       return result; 
     } 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

定製DatagridTemplateColumn:

public class DataRowColumn : DataGridTemplateColumn 
{ 
    public DataRowColumn(string column) { ColumnName = column; } 
    public string ColumnName { get; private set; } 
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) 
    { 
     var row = (DataRowView)dataItem; 
     var item = row[ColumnName]; 
     cell.DataContext = item; 
     var element = base.GenerateElement(cell, item); 
     return element; 
    } 
} 

從數據庫中的數據會是這樣:
enter image description here

我會加載最多250列,從數據庫20行。
我的問題是:
1.我保存的秒錶用於檢查加載DataGrid所花費的時間。它顯示的值小於250毫秒。但事實上,它正在花費太多的時間,並且在4-6秒的時間裏UI被掛起。爲什麼掛?如何克服它?
2.是否將DataTable的DefaultView附加到DataGrid是在性能方面做得更好的方法?
3. datagrid是顯示數據給定範圍的佈局類型的最佳方式嗎?我需要通過一些工具提示說明來顯示是否存在。
4.有什麼(屬性)我錯過了DataGrid來提高性能。

回答

1

是的,還有一些其他的事情可以改善性能。事實上,我之前已經回答過這個問題。

請看這個問題和我的答案。

Improve DataGrid Performance