[英]How to load element asynchronously
我希望每个模板都可以单独加载到我的堆栈面板中,而不必等到它们都准备就绪,有没有办法让它一个接一个地加载而程序没有冻结,而其他模板仍然加载?
在这里,我将listview收费到stackpanel
public MainPage()
{
this.InitializeComponent();
setdata();
}
public async void setdata()
{
for (int i = 0; i < 30; i++)
{
DataTemplate template = this.Resources["listT"] as DataTemplate;
var element = template.LoadContent() as UIElement;
ListView list = element as ListView;
for (int j = 0; j < 20; j++)
{
listS.Add("t: " + j);
}
list.DataContext = listS;
root.Children.Add(list);
}
}
和
<Page.Resources>
<ResourceDictionary>
<ItemsPanelTemplate x:Key="HorizontalTemplate">
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
<DataTemplate x:Key="HorizontalBoxeSectionTemplate">
<Grid Background="White">
<Image Source="/Assets/image.jpg" Stretch="UniformToFill"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="listT">
<ListView Grid.Row="1"
IsItemClickEnabled="True"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.IsHorizontalRailEnabled="True"
ItemsPanel="{StaticResource HorizontalTemplate}"
ItemsSource="{Binding }"
ItemTemplate="{StaticResource HorizontalBoxeSectionTemplate}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</DataTemplate>
</ResourceDictionary>
</Page.Resources>
<StackPanel Name="root">
</StackPanel>
您的代码中存在三个问题。
首先,您需要了解异步编程。 这并不意味着您向方法添加async
关键字,然后它将成为异步方法。 请参阅使用async进行异步编程并在c#中等待学习异步编程,并在UWP中查看异步编程以获取更多详细信息。
第二,使用StackPanel
作为ListView的ItemsPanelTemplate。 这涉及与UI虚拟化相关的内容。 总之,使用StackPanel
会降低ListView的性能。 您可以使用ItemsStackPanel
。 有关更多信息,请参阅ListView和GridView UI优化 。
第三,你最好不要在页面的构造函数中调用异步方法。 相反,您可以在页面的Loaded事件处理程序中调用它。
对于你上面的代码片段,我做了一些更改,并防止它阻止UI线程。 为了更清楚地看到,我添加了这个行代码await Task.Delay(1000);
。 然后您将清楚地看到ListView逐行添加到UI上,但页面仍然是响应式的。
<ItemsPanelTemplate x:Key="HorizontalTemplate">
<ItemsStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
this.Loaded += MainPage_Loaded;
}
private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
await setdata();
}
public List<string> listS { get; set; } = new List<string>();
public async Task setdata()
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
for (int i = 0; i < 30; i++)
{
DataTemplate template = this.Resources["listT"] as DataTemplate;
var element = template.LoadContent() as UIElement;
ListView list = element as ListView;
for (int j = 0; j < 20; j++)
{
listS.Add("t: " + j);
}
list.DataContext = listS;
root.Children.Add(list);
await Task.Delay(1000);
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.