我正在使用MVVMLight创建问卷并在渲染InkCanvas控件时遇到内存问题。以下是我与工作的淡化例如:UWP InkCanvas内存不足
QuestionVm
public Question Question { get; set; }
public HandwritingControl HandwritingControl { get; set; }
QuestionnaireVm
public List<QuestionVm> currentQuestions;
public List<QuestionVm> CurrentQuestions
{
get { return currentQuestions; }
set
{
currentQuestions = value;
RaisePropertyChanged();
}
}
Questionnaire.xaml.cs
//Clear form & iterate questions
questionnaireForm.Children.Clear();
foreach (var questionVm in questionnaireVm.CurrentQuestions)
{
questionnaireForm.Children.Add(questionVm.Question);
if(questionVm.HandwritingControl != null)
questionnaireForm.Children.Add(new InkCanvas());
}
内存在每个页面加载时都会出现尖峰,清楚地分配给InkCanvas的内存永远不会被释放。在大约〜125个InkCanvas控件呈现时,在第三页左右,应用程序抛出System.OutOfMemoryException。
我的问题是,为什么不释放这些控件?我怎么手动释放内存?如果我注释掉InkCanvas,问卷很好,而Children.Clear()似乎正在清理TextBlocks或任何其他控件而没有问题。
UPDATE
因此,与@Grace冯工作后,我试图重构我的方法和使用与数据模板一个ListView,而不是创建从我xaml.cs.网格
Questionnaire.xaml
<ListView Name="questionnaireListView" ItemsSource="{Binding CurrentQuestions, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Question.Text}" />
<TextBlock Text="{Binding Question.Description}" />
<InkCanvas/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Questionnaire.xaml.cs
private void buttonNext_Click(object sender, RoutedEventArgs e)
{
//Validate & goto next page
if (questionnaireVm.CurrentPageIsValid())
{
questionnaireVm.CurrentQuestions.Clear();
questionnaireVm.LoadNextPage();
}
}
不幸的是,我即使使用的ListView数据模板的方法仍然遇到相同的内存不足的错误。思考?
恩典,这是一个绝妙的解决方案,将被标记为答案。我对你有另一个问题。在存在大量问题/ InkCanvas /其他控件的情况下,我们的数据结构要复杂得多。最好的解决方案是为每个独特的组合创建一个DataTemplate?我觉得好像必须有办法让这种更多的数据驱动。通过网格方法,我只需根据每个问题给出的数据来渲染每一行。你将如何处理更复杂的情况? –
@jagsrocknfl,你的意思是你对所有问题都有两种以上的风格? –
是的,每个问题基本上是以下任意组合:文本/ InkCanvas和单选按钮/复选框/等等。这些都是数据驱动的,每个问题可能包含所有控件或仅包含文本。所以使用数据模板我们需要每个组合的新模板?或者只使用一个模板,它们都是可空的? –