首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WPF中使用Virtualization在运行时向Stackpanel添加数千个用户控件

在WPF中使用Virtualization在运行时向Stackpanel添加数千个用户控件
EN

Stack Overflow用户
提问于 2021-06-18 09:35:32
回答 1查看 112关注 0票数 0

(也许我真的很蠢,问了这个非常愚蠢的问题,但我会真诚地感谢对一些示例代码的详细帮助。)

我对编程非常陌生,对WPF特别陌生。这是我的第一个WPF应用程序,因此我不了解MVVM。因此,请不要将这个问题与MVVM联系起来,因为这是另一个主题,我也在努力学习。我想解决这个没有MVVM的问题。

现有代码简介:

我有一个用户控件(people_tile),没有什么花哨,只是一堆标签,具有不同的字体大小、不同的外观等等,当我创建这个用户控件的一个对象时,我将其中一个标签的内容更改为数据库中的ID值。当用户控件加载时,剩下的事情会发生在它的内部。我敢肯定,程序员们会记得他们开始的日子,嘲笑我,但我仍然在学习。

现在,当要将这个用户控件带到屏幕上时,我有了一种堆栈式的方法。当用户单击主屏幕上的按钮时,页面上将打开另一个用户控件。这个用户控件(people_page)中有一个堆栈面板,其中装载了people_tile用户控件。我不太擅长绑定,所以我所做的就是运行一个for循环,将ID值传递给为people_tile用户控件创建的对象,然后将这个people_tile控件作为子控件添加到people_page用户控件上可用的堆栈面板中。

问题陈述

所有这些都非常好,没有任何问题或问题,只是当数据增加时,将people_tile用户控件添加到people_page用户控件的堆栈面板控件需要很长时间。目前,我在people表中有大约1200件物品。但问题开始早在500个项目本身。在面板中创建这些用户控件需要花费大量的时间。

帮助需要

我如何在这里使用虚拟化。我尝试过将VirtualizingStackpanels作为一种选择,通过阅读其他帖子,但我认为如果我们不使用绑定,它没有任何意义,因此,基本上,如果有任何人可以在以下方面帮助我

使用绑定加载我的用户控件的

  1. 列表(我认为使用的术语是可观察的集合,但我在这里可能完全错了)

  1. 以ListBox的形式或直接在面板中或通过ItemsControl加载此用户控件列表,以最理想的方式加载

  1. 请注意,用户控件的数据文本应该是用户控件本身,因为我在用户控件中填充的其他数据只使用people_tile用户控件的初始化子程序中定义的datacontext = Me语句。

  1. ,最后,在Usercontrol上有一个click事件,它在代码中单独执行许多事情。我们也需要保留这一点。我的意思是,如果我们使用ListBox来保存用户控件,那么我可能会失去单个用户控件的单击功能。我不想那样。

真诚的要求:我对绑定不太熟悉或不精通,所以如果您提到绑定,那么也请告诉我需要在哪里修改代码。

ListBox approach尝试过的一些代码引用

在我创建的XAML中

代码语言:javascript
复制
     <ListBox x:Name="ListBox_Main">

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

在后面的密码里我有这个

以列表(Of UserControl_Tile_People) =新列表(Of UserControl_Tile_People)()

代码语言:javascript
复制
    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部分

以及用于用户控制的代码

代码语言:javascript
复制
    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

我能够自己解决它,而不用任何MVVM。谢谢你的支持。

EN

回答 1

Stack Overflow用户

发布于 2021-06-20 10:55:29

我能够自己解决它,而不用任何MVVM。谢谢你的支持。

我刚弄明白克莱门斯想跟我说什么。

谢谢克莱门斯所有的指导。真的很感激。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68032789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档