Я использую MVVMLight для создания вопросника и проблем с памятью при рендеринге элементов управления InkCanvas. Вот разбавленные пример того, что я работаю с:UWP InkCanvas Out Of Memory
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, вопросник прекрасен, и Child.Clear(), похоже, очищает TextBlocks или любые другие элементы управления без проблем.
UPDATE
Таким образом, после работы с @Grace Feng я пытался реорганизовать свой подход и использовать 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 для каждой уникальной комбинации? Я чувствую, что должен быть способ сделать это более управляемым данными. С помощью grid-подхода я просто рисую каждую строку на основе данных, данных для каждого вопроса. Как бы вы занялись более сложным сценарием? –
@jagsrocknfl, вы имеете в виду, что у вас есть более двух стилей для всех вопросов? –
Да, каждый вопрос представляет собой, по существу, любую комбинацию: Text/InkCanvas & Radio Button/Checkbox/etc. Это все данные, и каждый вопрос может иметь все элементы управления или только текст. Итак, используя шаблоны данных, нам нужен новый шаблон для каждой комбинации? Или просто используйте один шаблон, где все они имеют значение NULL? –