WPF не является веб-приложением. У вас есть состояние в настольном приложении, если вы не выбрасываете его каким-либо образом.
Страницы - анахронизм в терминах wpf.
Немногие команды используют их, отчасти потому, что обратное движение вперед и хлебные крошки не имеют особого использования.
В вашем случае вы могли бы потенциально использовать журнал кадра.
Я все еще, вероятно, не будет, хотя.
Я бы сделал это как приложение с одним окном с пользовательскими элементами управления, представленными в элементе управления контентом для навигации. Пользователь контролирует не страницы. Контентконтроль не фрейм.
Используя MVVM, вы можете сначала перемещаться, используя viewmodel. Создав шаблон модели представления, которую вы привязываете к содержимому элемента управления контентом, в представление.
Сохраните ссылку на модель представления, и вы сохраните состояние.
Вам понадобится какой-нибудь таймер, чтобы в 6 часов вы знали, что пора снова войти в систему.
Это будет указано в модели представления главного окна.
Когда таймер достигает нуля, он сохраняет ссылку на любую текущую модель представления и «переходит» на страницу входа. После завершения процесса в loginviewmodel затем сообщает mainwindowviewmodel, что это сделано.
Я бы, наверное, использовал для этого мессенджер mvvmlight. Он использует шаблон pub / sub.
https://social.technet.microsoft.com/wiki/contents/articles/26070.communicating-between-classes.aspx
Это очень упрощенная иллюстрация навигации первого вида:
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type local:LoginViewModel}">
<local:LoginUC/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:UserViewModel}">
<local:UserUC/>
</DataTemplate>
</Window.Resources>
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel>
<Button Content="Login Page"
Command="{Binding NavigateCommand}"
CommandParameter="{x:Type local:LoginViewModel}"
/>
<Button Content="User Page"
Command="{Binding NavigateCommand}"
CommandParameter="{x:Type local:UserViewModel}"
/>
</StackPanel>
<ContentControl Grid.Column="1"
Content="{Binding CurrentViewModel}"
/>
</Grid>
ViewModel
public class MainWindowViewModel : INotifyPropertyChanged
{
private object currentViewModel;
public object CurrentViewModel
{
get { return currentViewModel; }
set { currentViewModel = value; RaisePropertyChanged(); }
}
private RelayCommand<Type> navigateCommand;
public RelayCommand<Type> NavigateCommand
{
get
{
return navigateCommand
?? (navigateCommand = new RelayCommand<Type>(
vmType =>
{
CurrentViewModel = null;
CurrentViewModel = Activator.CreateInstance(vmType);
}));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Вы можете кэшировать экземпляры каждой модели представления в словаре, используя тип в качестве ключа, если вы хотите сохранить состояние всего. Проверьте, есть ли он у вас, и верните его, если он есть или создан.
В самом простом случае вы могли бы просто иметь закрытый объект, который содержит последнюю модель представления, когда вам нужно переключиться обратно из входа в систему.
Может быть, вы не хотите слишком буквально понимать эти 6 часов, если пользователь находится в центре чего-то.
Я полагаю, вы также можете сделать что-то вроде предупреждения в 5:30 и позволить им снова войти в систему еще на 6 часов.