1

私はDataGrid倉庫の占有率を表示するために使用しています(占有されている - ボックス付きの画像を表示する、占有されていない - 空の画像を表示する)。
DataGrid ではDataGridTemplateColumn、イメージをオーバーライドするために使用しています。私のメイン フォーム XAML コード:

<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>


DataGrid のデータ テンプレート:

<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;
    }  

DataGrid の ValueConverter:

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;
    }
}

データベースからのデータは次のようになります。
ここに画像の説明を入力

データベースから最大 250 列、20 行をロードします。
私の質問は次のとおり
です。 1. DataGrid の読み込みにかかる時間を確認するために保持したストップウォッチ。250ms未満の値を示しています。しかし、実際にはテイクショーが多すぎて、4 ~ 6 秒間 UI がハングアップします。なぜぶら下がっているのですか?それを克服する方法は?
2. DataTable の DefaultView を DataGrid にアタッチすることは、賢明なパフォーマンスを実現するためのより良い方法ですか??
3.データグリッドは、指定された範囲のデータのマップの種類のレイアウトを表示する最良の方法ですか? ツールチップの説明で存在と不在を示す必要があります。
4. パフォーマンスを改善するために DataGrid で見逃したもの (プロパティ) はありますか?

4

1 に答える 1

1

はい、パフォーマンスを向上させるためにできることは他にもいくつかあります。実は、これについては以前に質問に答えたことがあります。

この質問と私の答えを見てください。

DataGrid のパフォーマンスを向上させる

于 2013-01-03T07:39:50.293 に答える