Bài viết phổ biến của tác giả
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我拥有两个用户控件。
第一个包含一个ItemsControl
,我必须用第二个用户控件动态填充它。第二个用户控件可能递归包含另一个ÌtemsControl
本身,因此初始化它是一个很繁琐的控件。
这是我对SubControl
所做的操作:
public sealed partial class SubControl : UserControl
{
public SubControl(ModelA item)
{
this.InitializeComponent();
this.DataContext = item;
//if the current item has child items, add them to the ItemsControl:
if(item.SubItems != null)
{
BuildUI(item.SubItems);
}
}
private void BuildUI(List data)
{
foreach(var item in data)
{
var dataItem = item as ModelA;
//we only want item of type ModelA in our ItemsControl:
if(dataItem != null)
{
SubElements.Items.Add(new SubControl(dataItem));
}
}
}
}
MainControl
编写的内容,其
ItemsControl
(称为
Elements
)将包含一组这些
SubControl
:
public sealed partial class MainControl : UserControl
{
public MainControl(List data)
{
this.InitializeComponent();
BuildUI(data);
}
private void BuildUI(List data)
{
foreach(var item in data)
{
var dataItem = item as ModelA;
if(dataItem != null)
{
Elements.Items.Add(item);
}
}
}
}
MainControl
Mã số:
public sealed partial class MainControl : UserControl
{
public MainControl(List data)
{
this.InitializeComponent();
BuildUI(data);
}
private async void BuildUI(List data)
{
var list = new List();
await Task.Run(() =>
{
foreach(var item in data)
{
var dataItem = item as ModelA;
if(dataItem != null)
{
list.Add(new SubControl(dataItem));
}
}
});
foreach(var item in list)
{
Elements.Items.Add(item);
}
}
}
SubControl
,以便不会阻塞UI,并且在初始化所有用户控件后,我们会将其添加到
ItemsControl
TRONG
MainControl
ở giữa.
SubControl
也是如此!在构建真正奇怪的
SubControl
时会崩溃,因为它对实际的UI没有任何影响;它们只是被添加到一个临时的
Danh sách
ở giữa.
1 Câu trả lời
Windows UI是非常单线程的。必须创建每个UI控件,并且只能在单个线程中使用。没有办法解决这个问题。
因此,是时候对解决方案进行一些不同的思考了。创建数十个控件是没有问题的。 UI可以很好地处理。您正在谈论将数百或数千个项目添加到列表控件中,那只是一个不可用的UI。因此,正确的解决方案是重新考虑您的UI设计。也许您可以将结果分为几类。
如果您已经考虑过UI设计并且仍然确定要向用户显示成百上千个项目,那么答案就是使用virtualization。这不仅比简单的foreach
循环难编码,而且是有效显示大量数据的唯一方法。
关于c# - 如何在另一个线程中初始化沉重的控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747450/
Tôi là một lập trình viên xuất sắc, rất giỏi!