Добавление тысяч пользовательских элементов управления в Stackpanel во время выполнения в WPF с использованием виртуализации

(Может быть, я действительно глуп, задав этот действительно глупый вопрос, но я был бы искренне признателен за подробную помощь с некоторыми образцами кода, пожалуйста)

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

Кратко о существующем коде:

У меня есть пользовательский элемент управления (people_tile), ничего особенного, просто набор меток с разными размерами шрифта, разным внешним видом и т. Д., Когда я создаю объект этого пользовательского элемента управления, я меняю содержимое одной из меток на значение идентификатора, которое есть в базе. Остальное происходит внутри пользовательского элемента управления, когда он загружается. Я уверен, что опытные программисты вспомнят свои первые дни и посмеются надо мной, но я все еще учусь.

Теперь, когда дело доходит до вывода этого пользовательского элемента управления на экран, у меня есть подход с использованием стековой панели. Когда пользователь нажимает кнопку на главном экране, на странице открывается другой элемент управления. в этом пользовательском элементе управления (people_page) есть панель стека, в которую загружается пользовательский элемент управления people_tile. Я не очень хорошо разбираюсь в привязке, поэтому все, что я делаю, это запускаю цикл for, передаю значение идентификатора объекту, созданному для пользовательского элемента управления people_tile, а затем добавляю этот элемент управления people_tile в качестве дочернего элемента в панель стека, доступную на пользовательском элементе управления people_page. .

Постановка задачи

Все это работает абсолютно нормально, и никаких проблем или проблем, за исключением того, что при увеличении данных требуется очень много времени для добавления пользовательского элемента управления people_tile в элемент управления stackpanel пользовательского элемента управления people_page. В настоящее время у меня около 1200 элементов в таблице людей. Но проблема начинается уже с 500 предметов. Создание множества пользовательских элементов управления внутри панели занимает очень много времени.

Требуется помощь

Как мне использовать виртуализацию здесь. Я пробовал VirtualizingStackpanels как вариант, читая другие сообщения, но я думаю, что это ничего не значит, если мы не используем привязку, поэтому в основном, если кто-то может мне помочь в следующих случаях

  1. Загрузка списка моих пользовательских элементов управления с использованием привязки (я думаю, что используемые термины - это наблюдаемая коллекция, но здесь я могу ошибаться)

  2. Загрузка этого списка пользовательских элементов управления либо в виде ListBox, либо непосредственно в моей панели, либо через ItemsControl, в зависимости от того, что является наиболее предпочтительным способом

  3. Обратите внимание, что контекст данных пользовательского элемента управления должен быть самим пользовательским элементом управления, так как другие данные, которые я заполняю внутри пользовательского элемента управления, используют оператор Datacontext = Me, определенный только в подпрограмме инициализации пользовательского элемента управления people_tile.

  4. Наконец, в Usercontrol есть событие щелчка, которое выполняет множество действий отдельно в коде. Нам нужно сохранить и это. Я имею в виду, что если мы будем использовать ListBox для хранения пользовательских элементов управления, я могу потерять функциональность щелчка отдельных пользовательских элементов управления. Мне этого не надо.

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

Некоторые ссылки на код для вещей, которые я пробовал с подходом ListBox

В XAML я создал

           <ListBox x:Name="ListBox_Main">

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <local:UserControl_Tile_People/>
                </DataTemplate>
            </ListBox.ItemTemplate>               
            
     </ListBox>

В коде позади у меня есть это

Затемнить элементы как список (Of UserControl_Tile_People) = Новый список (Of UserControl_Tile_People) ()

          For row_cntr = 0 To global_dt_people_master_list.Rows.Count - 1

        Dim objTile As New UserControl_Tile_People
        objTile.lblPerson_id.Content = global_dt_people_master_list.Rows(row_cntr).Item("bp_id").ToString
        objTile.DataContext = objTile

        items.Add(New UserControl_Tile_People() With {
                  .id_value_passed = global_dt_people_master_list.Rows(row_cntr).Item("bp_id").ToString
                  })

    Next


    Me.ListBox_Main.ItemsSource = items

Это не дает мне никакой виртуализации. Он также не загружает элементы управления пользователя. код для моего пользовательского элемента управления выглядит следующим образом

Часть XAML

И код для Usercontrol

          Private Sub UserControl_Tile_People_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded  
    Me.lblPerson_id.Content = id_value_passed
    lbl_person_id_changed()
    End Sub


    Public Sub lbl_person_id_changed()
    Dim id_value As String = ""
    If Me.lblPerson_id.Content <> "0" Then
        id_value = Me.lblPerson_id.Content
        prp_Person_Print_Name = id_value
        prp_Mobile_Number = id_value
        prp_LRP_Points = id_value
        prp_LRP_cadre = id_value
        prp_Person_Type = id_value
    End If
    End Sub

    Dim pvt_Person_Print_Name As String
    Public Property prp_Person_Print_Name As String
    Get
        Return pvt_Person_Print_Name
    End Get
    Set(value As String)
        pvt_Person_Print_Name = value
        
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Prp_Person_Print_Name"))
    End Set
    End Property

1 ответ

Я смог решить это сам, без использования MVVM. Спасибо всем за поддержку.

Я только что понял, что Клеменс пытался мне сказать.

Спасибо, Клеменс, за все советы. Действительно ценю это.

Другие вопросы по тегам