TabControl — Сохранение элементов табуляции UserControl в памяти при переключении вкладок

#c# #wpf #tabs #user-controls #contenttemplate

Вопрос:

У меня был элемент управления вкладками, где каждый элемент вкладки был пользовательским элементом управления. Проблема возникала всякий раз, когда программа запускалась, каждый отдельный элемент управления инициализировался и загружался. Затем, при переключении на вкладку, он должен был бы перезагрузиться снова.

С тех пор я изменил способ загрузки элементов вкладки, как показано ниже. Это предотвращает инициализацию и загрузку пользовательских элементов управления, пока они не будут включены (что предпочтительно):

 lt;TabControlgt;  lt;TabItemgt;  lt;TabItem.ContentTemplategt;  lt;DataTemplategt;  lt;local:ctlHome /gt;  lt;/DataTemplategt;  lt;/TabItem.ContentTemplategt;  lt;/TabItemgt;  lt;TabItemgt;  lt;TabItem.ContentTemplategt;  lt;DataTemplategt;  lt;local:ctlTwo /gt;  lt;/DataTemplategt;  lt;/TabItem.ContentTemplategt;  lt;/TabItemgt;  ... lt;/TabControlgt;  

Когда я впервые развернул это, каждый раз, когда я переключался на новую вкладку, она вызывала конструктор -gt; Выгрузить предыдущую вкладку -gt;gt; Загрузить новую вкладкуgt;gt;, что здорово. Он вызывал конструктор только один раз, и всякий раз, когда я повторно выбирал вкладку, он просто выгружал- gt; загружалgt;, как и ожидалось.

Теперь каждый раз, когда я выбираю вкладку, она вызывает конструктор и повторно инициализирует весь элемент управления. Я не уверен, почему он больше не хранит вкладку в памяти.

Есть ли какой-либо способ сохранить пользовательские элементы управления в памяти после их инициализации с помощью этого метода?

Ответ №1:

Если вы используете a DataTemplate с a ContentControl , загружается только изначально видимый элемент управления:

 lt;TabControl xmlns:s="clr-namespace:System;assembly=mscorlib"gt;  lt;TabControl.Itemsgt;  lt;s:Stringgt;homelt;/s:Stringgt;  lt;s:Stringgt;twolt;/s:Stringgt;  lt;/TabControl.Itemsgt;  lt;TabControl.ContentTemplategt;  lt;DataTemplategt;  lt;ContentControlgt;  lt;ContentControl.Stylegt;  lt;Style TargetType="ContentControl"gt;  lt;Setter Property="Content"gt;  lt;Setter.Valuegt;  lt;local:ctlHome /gt;  lt;/Setter.Valuegt;  lt;/Settergt;  lt;Style.Triggersgt;  lt;DataTrigger Binding="{Binding}" Value="two"gt;  lt;Setter Property="Content"gt;  lt;Setter.Valuegt;  lt;local:ctlTwo /gt;  lt;/Setter.Valuegt;  lt;/Settergt;  lt;/DataTriggergt;  lt;/Style.Triggersgt;  lt;/Stylegt;  lt;/ContentControl.Stylegt;  lt;/ContentControlgt;  lt;/DataTemplategt;  lt;/TabControl.ContentTemplategt; lt;/TabControlgt;  

Однако оба элемента управления инициализируются немедленно, но это не должно быть проблемой, так как вы не должны выполнять ничего сложного в конструкторах. Переместите любую логику инициализации в обработчик Loaded событий или аналогичный.