Производительность рендеринга сетки данных wpf (пользовательский контроль сетки) - PullRequest
1 голос
/ 01 июля 2011

** Пожалуйста, смотрите обновления к вопросу ниже

Я пытаюсь использовать сетку данных в своем приложении WPF, но считаю, что производительность невыносима.

Я привязываюсь к набору данных, содержащему только 100 строк и 15 столбцов, и любой вид прокрутки или даже изменения ширины столбца, меняющий размеры, ЧРЕЗВЫЧАЙНО медленно.

Я помню, что старые таблицы данных winforms имели низкую производительность, когда границы ячеек были включены, но отключение линий сетки в аналоге wpf не действует.

Окно с сеткой:

<Window x:Class="GridPerformanceTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True" EnableColumnVirtualization="True" EnableRowVirtualization="True"
              VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" Background="{x:Null}" 
              BorderBrush="{x:Null}" IsSynchronizedWithCurrentItem="False" BorderThickness="0" RowHeight="15" 
              GridLinesVisibility="None" HorizontalGridLinesBrush="{x:Null}" VerticalGridLinesBrush="{x:Null}" ColumnHeaderHeight="15"/>
</Grid>

Как я заполняю свои данные:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataSource source = new DataSource();

        DataSet ds = new DataSet();
        ds.Tables.Add(source.Execute("select * from tbl_users"));

        this.DataContext = ds.Tables[0];
    }
}

EDIT:

Так как мне не повезло с сеткой данных, которая, я уверен, имеет гораздо больше возможностей, чем то, что я сейчас ищу (просто отображать простой текст и выбирать данные для копирования / вставки), я решил попробовать и поработать самостоятельно.

Это будет мой первый выстрел в пользовательском элементе управления, но я уже нашел источник плохой производительности ... сетку.

Если я напишу элемент управления с разделителями сетки для моих столбцов и стековых панелей, которые содержат мои данные строк, прокрутка строк будет безупречна - как я привык к хорошей таблице данных winforms.

Код управления сеткой:

public partial class CustomGridControl : UserControl
{
    public CustomGridControl()
    {
        InitializeComponent();

        for (int i = 0; i < 20; i++)
        {
            ColumnDefinition col = new ColumnDefinition();
            col.Width = new GridLength(75);
            _rootGrid.ColumnDefinitions.Add(col);

            StackPanel pnl = new StackPanel();
            pnl.Orientation = Orientation.Vertical;

            for (int x = 0; x < 1000; x++)
            {
                TextBlock blk = new TextBlock();
                blk.Foreground = Brushes.Black;
                blk.Text = "Row: " + x.ToString() + " Col: " + i.ToString();

                pnl.Children.Add(blk);
            }

            Grid.SetColumn(pnl, i);
            _rootGrid.Children.Add(pnl);

            GridSplitter splitter = new GridSplitter();
            splitter.Width = 2;
            splitter.BorderBrush = Brushes.Black;

            Grid.SetColumn(splitter, i);
            Grid.SetRowSpan(splitter, 1000);

            _rootGrid.Children.Add(splitter);

        }
    }

И XAML:

<UserControl x:Class="CustomGrid.CustomGridControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

<Grid >
    <ScrollViewer>
        <Grid x:Name="_rootGrid" Background="Aqua"/>
    </ScrollViewer>
</Grid>

Когда я пытаюсь перетащить один из разделителей, производительность ужасна, как и со стандартной сеткой данных WPF.

Теперь я знаю, что я не делаю никакой виртуализации для повышения производительности или чего-то еще, но производительность с помощью стековых панелей все еще легко в 100 раз выше.

Чтобы обновить мой вопрос, я хотел бы знать, есть ли у кого-нибудь идеи, как обрабатывать столбцы в панели другого типа, которая позволила бы использовать те же функциональные возможности типа gridsplitter для столбцов.

Будем весьма благодарны за любые хорошие ссылки на пользовательские панели / сетки.

1 Ответ

1 голос
/ 03 мая 2012

Как предлагается здесь , вы можете немного улучшить производительность, установив «EnableRowVirtualization» и «EnableColumnVirtualization» вместо свойств VirtualizingStackPanel.*.

Вы также можете улучшить еговещи путем установки фиксированной ширины столбца.

...