Ответ Dennis
превосходен и очень хорошо сработал для меня.Однако оригинальная статья, о которой идет речь в его посте, в настоящее время отсутствует, поэтому его ответ требует немного больше информации, чтобы его можно было использовать прямо из коробки.
Этот ответ дан с точки зрения MVVM и былпротестировано под VS 2013.
Сначала немного фона.Первый ответ из Dennis
работает так, что он скрывает и показывает содержимое вкладки, а не уничтожает и воссоздает указанное содержимое вкладки каждый раз, когда пользователь переключает вкладку.
Это имеет следующие преимущества:
- Содержимое полей редактирования не исчезает при переключении вкладки.
- Если вы используете древовидное представление на вкладке, оно не сворачивается между изменениями вкладки.
- Текущий выбор для любых сеток сохраняется между переключателями табуляции.
- Этот код более соответствует стилю программирования MVVM.
- Нам не нужно писать код для сохранения и загрузки.изменения на вкладке между вкладками изменяются.
- Если вы используете сторонний элемент управления (например, Telerik или DevExpress), такие параметры, как расположение сетки, сохраняются между переключателями вкладок.
- Значительные улучшения производительности- переключение вкладок происходит практически мгновенно, поскольку мы не перерисовываем все при каждом изменении вкладки.
TabControlEx.cs
// Copy C# code from @Dennis's answer, and add the following property after the
// opening "<Style" tag (this sets the key for the style):
// x:Key="TabControlExStyle"
// Ensure that the namespace for this class is the same as your DataContext.
Это относится к тому же классу, на который указывает DataContext.
XAML
// Copy XAML from @Dennis's answer.
Это стиль,Он входит в заголовок файла XAML.Этот стиль никогда не меняется, и на него ссылаются все элементы управления вкладками.
Исходная вкладка
Ваша исходная вкладка может выглядеть примерно так.Если вы переключите вкладки, вы заметите, что содержимое полей редактирования исчезнет, так как содержимое вкладки снова будет удалено и создано заново.
<TabControl
behaviours:TabControlBehaviour.DoSetSelectedTab="True"
IsSynchronizedWithCurrentItem="True">
<TabItem Header="Tab 1">
<TextBox>Hello</TextBox>
</TabItem>
<TabItem Header="Tab 2" >
<TextBox>Hello 2</TextBox>
</TabItem>
Пользовательская вкладка
Измените вкладку, чтобы использовать наш новый пользовательский класс C #, и укажите на наш новый пользовательский стиль, используя тег Style
:
<sdm:TabControlEx
behaviours:TabControlBehaviour.DoSetSelectedTab="True"
IsSynchronizedWithCurrentItem="True"
Style="{StaticResource TabControlExStyle}">
<TabItem Header="Tab 1">
<TextBox>Hello</TextBox>
</TabItem>
<TabItem Header="Tab 2" >
<TextBox>Hello 2</TextBox>
</TabItem>
Сейчас, при переключении вкладок вы обнаружите, что содержимое полей редактирования сохраняется, что доказывает, что все работает хорошо.
Обновление
Это решение работает оченьЧто ж.Однако есть более модульный и дружественный MVVM способ сделать это, который использует прикрепленное поведение для достижения того же результата.См. Код проекта: WPF TabControl: Отключение виртуализации вкладки .Я добавил это как дополнительный ответ.
Обновление
Если вы используете DevExpress
, вы можете использовать опцию CacheAllTabs
, чтобы получить то же самоеэффект (это отключает виртуализацию вкладок):
<dx:DXTabControl TabContentCacheMode="CacheAllTabs">
<dx:DXTabItem Header="Tab 1" >
<TextBox>Hello</TextBox>
</dx:DXTabItem>
<dx:DXTabItem Header="Tab 2">
<TextBox>Hello 2</TextBox>
</dx:DXTabItem>
</dx:DXTabControl>
Для записи, я не связан с DevExpress, я уверен, что Telerik имеет аналог.
Update
Telerik имеет эквивалент: IsContentPreserved
.Спасибо @Luishg в комментариях ниже.