Добавление тысяч пользовательских элементов управления в 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 как вариант, читая другие сообщения, но я думаю, что это ничего не значит, если мы не используем привязку, поэтому в основном, если кто-то может мне помочь в следующих случаях
Загрузка списка моих пользовательских элементов управления с использованием привязки (я думаю, что используемые термины - это наблюдаемая коллекция, но здесь я могу ошибаться)
Загрузка этого списка пользовательских элементов управления либо в виде ListBox, либо непосредственно в моей панели, либо через ItemsControl, в зависимости от того, что является наиболее предпочтительным способом
Обратите внимание, что контекст данных пользовательского элемента управления должен быть самим пользовательским элементом управления, так как другие данные, которые я заполняю внутри пользовательского элемента управления, используют оператор Datacontext = Me, определенный только в подпрограмме инициализации пользовательского элемента управления people_tile.
Наконец, в 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. Спасибо всем за поддержку.
Я только что понял, что Клеменс пытался мне сказать.
Спасибо, Клеменс, за все советы. Действительно ценю это.