Steve15f Ответов: 2

Как повысить производительность 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, я заполнил эту переменную. Все нормально.

2 Ответов

Рейтинг:
1

#realJSOP

Если вы еще не делаете этого, вместо того, чтобы использовать обычный список, используйте ObservableCollection.

Вся Контрольная популяция будет происходить без необходимости писать какой-либо код.

Другой метод заключается в том, чтобы дождаться отображения формы перед загрузкой данных, чтобы во время загрузки можно было показать курсор ожидания.


Рейтинг:
0

Gerry Schmitz

В вашем коде много чего не так; прежде всего, использование "невиртуализирующейся" UniformGrid. Вам нужно придерживаться основ.

элемент управления ItemsControl.Собственность Для (Системы.Окна.Управления)[^]


Steve15f

Привет
Что мне нужно изменить ? Спасибо.