#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
событий или аналогичный.