** Пожалуйста, смотрите обновления к вопросу ниже
Я пытаюсь использовать сетку данных в своем приложении 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 для столбцов.
Будем весьма благодарны за любые хорошие ссылки на пользовательские панели / сетки.