Как повысить производительность WPF
Всем привет,
Я разрабатываю приложение C# WPF.
В моем XAML у меня есть ItemsControl с моим списком в ItemsSource, в привязке. Например :
<ItemsControl x:Name="lvDataBinding" Foreground="AliceBlue" ItemsSource="{Binding LstAvis}" Margin="0" ScrollViewer.CanContentScroll="True" VirtualizingPanel.IsVirtualizing="True" VerticalAlignment="Top"> <ItemsControl.ItemTemplate> <DataTemplate> <Border BorderBrush="White" BorderThickness="1" CornerRadius="3" Margin="{Binding strMargin}" Opacity="{Binding dblOpacityCurrent}" HorizontalAlignment="Left" VerticalAlignment="Top"> <Grid Width="{Binding dblWidth}" Height="{Binding strHeightGrid}" Tag="{Binding strNumAvis}" Margin="0.1" Background="{Binding scbColorCurrentSelected}" > </Grid> </Border> </DataTemplate> </ItemsControl.ItemTemplate> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <UniformGrid Columns="1"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl>
Затем в моем заднем коде у меня есть функция в потоке для заполнения списка :
public void NewConstruct_View() { Application.Current.Dispatcher.Invoke(new Action(() => _lstAvistemp.Clear())); Dispatcher.Invoke(new Action(() => Mouse.OverrideCursor = Cursors.Wait)); //Insere la liste dans l'objet qui permettra son affichage for (int i = 0; i <= dt_DATA.Rows.Count - 1; i++) { Avis = new CL_Avis(); Avis.strNumAvis = dt_DATA.Rows[i]["QMNUM"].ToString(); Application.Current.Dispatcher.Invoke(new Action(() => _lstAvistemp.Add(Avis))); } Dispatcher.Invoke(new Action(() => LstAvis.ReplaceRange(_lstAvistemp))); Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle, null); }
Но моему приложению нужно 5 секунд для выполнения
Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle, null);и покажите мою сетку.
У меня всего 500 строк, и я думаю, что это очень медленно.
Я упростил код для чтения, но у меня есть только около 20 полей (это не так много...)
Я работал в потоке, мой список - в списке типа RangeOBservableCollection.
Спасибо за вашу помощь.
Что я уже пробовал:
Я видел, что у меня были некоторые исключения :
Цитата:Система.Окна.Ошибка в данных: 23 : невозможно преобразовать '&ЛТ;нуль&ГТ;' типа '&ЛТ;нуль&ГТ;' для типа 'System.Windows.Visibility "для культуры" en-US " с преобразованиями по умолчанию; рассмотрите возможность использования свойства конвертера привязки. NotSupportedException:'Система.NotSupportedException: преобразование de EnumConverter невозможно à partir de (null).
система.ComponentModel.Преобразователь типов.GetConvertFromException(значение объекта)
система.ComponentModel.Преобразователь типов.Командлет convertfrom(ITypeDescriptorContext контексте, свойство CultureInfo культуры, значение объекта)
система.ComponentModel.EnumConverter.Командлет convertfrom(ITypeDescriptorContext контексте, свойство CultureInfo культуры, значение объекта)
à г-жа внутренние данные.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)'
Я исправил это исключение. У меня была переменная для видимости в моей привязке null, я заполнил эту переменную. Все нормально.