好吧,我是Windows Phone的新手。
我只是在读取包含大量数据的XML并将其保存在静态var上。 当我创建一个循环来显示我从XML获得的数据时,我创建了一个包含2个Textblock的Canvas。
但XML有近500行信息,因此该应用程序创建了500个Canvas和1000个TextBlocks。 当我尝试在页面之间移动时,应用程序变得太慢,有时会冻结,当我从那个页面移动到另一个页面时,内存不会被处理掉,而且几乎所有方法都会使应用程序崩溃并出现OutOfMemory Exception。
我想知道当我导航到另一个页面时,我是否可以做一些事情来处理应用程序上使用的内存,或者是否有某种方法可以在同一个XAML中使用更少的内存来显示所有这些数据。
OBS:只需加载页面即可使用近130MB的内存,手机只需150MB即可。
编辑:
private void empilharParticipantes()
{
string nomeTitulo, nomeEmpresa;
int margin = 0;
SolidColorBrush corTexto = new SolidColorBrush();
corTexto.Color = Color.FromArgb(255, 103, 103, 103);
SolidColorBrush corCanvas = new SolidColorBrush();
corCanvas.Color = Color.FromArgb(255, 242, 242, 242);
items = from query in App.xmlParticipantes.Descendants("Participante")
orderby query.Element("title").Value
select new ABPI.Classes.Participantes
{
nome = (string)query.Element("title"),
empresa = (string)query.Element("company"),
email = (string)query.Element("email"),
telefone = (string)query.Element("phone"),
profissao = (string)query.Element("text"),
endereco = (string)query.Element("address")
};
var itemsArray = items.ToArray();
for (int i = 0; i < itemsArray.Count(); i++)
{
Canvas cnv = new Canvas { Name = itemsArray[i].nome, HorizontalAlignment = HorizontalAlignment.Left, Height = 90, Width = 420, Margin = new Thickness(30, margin, 0, 0), Background = corCanvas };
if (itemsArray[i].nome.Length > 30)
{
nomeTitulo = itemsArray[i].nome.Substring(0, 30) + "...";
}
else
{
nomeTitulo = itemsArray[i].nome;
}
if (itemsArray[i].empresa.Length > 35)
{
nomeEmpresa = itemsArray[i].empresa.Substring(0, 35) + "...";
}
else
{
nomeEmpresa = itemsArray[i].empresa;
}
TextBlock titulo = new TextBlock { Text = nomeTitulo, TextWrapping = TextWrapping.Wrap, FontSize = 25, Foreground = corTexto };
Canvas.SetLeft(titulo, 30);
Canvas.SetTop(titulo, 15);
TextBlock empresa = new TextBlock { TextWrapping = TextWrapping.Wrap, Text = nomeEmpresa, FontSize = 20, Foreground = corTexto };
Canvas.SetLeft(empresa, 30);
Canvas.SetTop(empresa, 45);
cnv.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(uriParametro);
cnv.Children.Add(titulo);
cnv.Children.Add(empresa);
content.Children.Add(cnv);
margin = margin + 100;
}
txtbusca2.ItemsSource = lista;
ContentPanel.Height = margin;
content.Height = margin;
oScroll.Content = content;
在循环之后,我将Canvas(内容)放在ScrollViewer(oScroll)中,但是当我离开页面时,内存没有被丢弃,所以当我尝试去其他地方时,应用程序崩溃了。 OutOfMemoryException异常
答案 0 :(得分:0)
您需要明确删除这些控件。处理Unloaded
事件或覆盖OnNavigatedFrom()
方法,只需删除所有子项。
LayoutRoot.Children.Clear();