【发布时间】:2017-08-04 03:47:30
【问题描述】:
我正在创建基于某些对象的动态 UI,并且由于要呈现大量项目,因此加载需要很长时间。 见下面的xml:-
<ScrollViewer Grid.Row="2" ZoomMode="Enabled" x:Name="scrollviewer"
VirtualizingStackPanel.VirtualizationMode="Recycling"
HorizontalScrollMode="Auto"
VerticalScrollMode="Auto"
VerticalSnapPointsType="None"
HorizontalSnapPointsType="None"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
MinZoomFactor="1" IsDoubleTapEnabled="True"
RenderTransformOrigin="0,0">
<Grid Background="#FFDDE6EB" x:Name="mygrid" VerticalAlignment="Center" HorizontalAlignment="Center">
</Grid>
</ScrollViewer>
滚动查看器位于高度为 10* 的行内。
动态加载项目的代码如下:-
public static Grid LoadGridWithItems(Model m)
{
var grid = new Grid();
grid.UseLayoutRounding = true;
grid.RowDefinitions.Clear();
grid.ColumnDefinitions.Clear();
int count = m.Rows;
for (int i = 0; i < count; i++)
{
grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
}
count = m.Columns;
for (int i = 0; i < count; i++)
{
grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(m.GetColumnWidth(i), GridUnitType.Star) });
}
foreach (Control control in m.Controls)
{
UIElement uicontrol=null;
if (control.Type != null)
{
switch (control.Type.ToLower())
{
case "textbox":
uicontrol=new TextBox();
break;
case "label":
uicontrol = new Label();;
break;
//bunch of other custom controls
}
}
grid.Children.Add(uicontrol);
}
return grid;
}
然后将此生成的网格作为子项添加到上述 xaml 中定义的“mygrid”中。有时项目超过 5000 个,加载大约需要 20-25 秒。 有关如何以更好的方式实施此方案的任何建议?
谢谢!
【问题讨论】:
-
有什么理由不使用 MvvM?我之所以问,是因为如果您的要求允许,您可以将
ListView与Virtualization一起使用,这意味着它只会在项目被带到查看时创建项目。这将显着提升性能,因为它将渲染 100 个项目而不是 5000 个。 -
不能使用 mvvm 的唯一原因是因为每一行都有不同的控制组合,因此我没有可以使用的单一数据模板。添加到网格的控件仍然绑定到“控件”类中的属性,但只是我不确定如何为每一行生成不同的模板。
-
查看
TemplateSelector,您将能够选择要应用的模板,如果您将容器更改为ListView,那么您可以使用前面提到的Virtualization。
标签: c# wpf performance xaml scrollviewer