Я делаю приложение WPF для продаж. Что я хочу сделать, так это перейти к разным представлениям, выбирая, сохранять ли историю навигации (в случае, если я хочу сохранить временный экземпляр транзакции) или удалить одну или всю историю навигации (в случае, если я хочу проверить все временные транзакции) например, у меня есть транзакция страницы есть случай, когда я хочу временно оставить другие экземпляры этой страницы открытыми или удалить все экземпляры, если я закончил одну или все транзакции. Я сделал главное окно, содержащее рамку. Я хочу перейти на другую страницу внутри фрейма при нажатии кнопки, а также выбрать сохранение или удаление истории навигации. Что я сделал до сих пор, так это реализовал класс модели оконного представления и создал свойство (PageView), которое является перечислением, которое я могу преобразовать в представление страницы, которое я хочу показать.
Перечисление просмотров страниц
public enum PageView
{
Main=0,
SecondPage=1
}
Преобразователь из свойства PageView в страницу, которую я хочу показать
public class PageConverter : BaseCoverter<PageConverter>
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
switch ((PageView)value)
{
default: Debugger.Break();
return null;
case PageView.Main:
return new MainPage();
case PageView.SecondPage:
return new SecondoryPage();
}
}
public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Модель вида главного окна
class WindowVM:BaseViewModel
{
private Window VWindow;
private PageView _pageView= PageView.Main;
public WindowVM(Window window)
{
VWindow = window;
SwitchView = new RelayCommand(_SwitchView, _CheckButton);
}
public PageView CurrentPage
{
set
{
_pageView = value;
OnPropertyChanged();
}
get { return _pageView; ; }
}
public ICommand SwitchView { get; set; }
private void _SwitchView()
{
((WindowVM)((MainWindow)Application.Current.MainWindow).DataContext).CurrentPage = PageView.SecondPage;
}
private bool _CheckButton(object parameter)
{
return true;
}
}
Сейчас у меня есть фрейм, который создает новую страницу каждый раз, когда используется команда SwitchView. Я хочу выбрать, хочу ли я иметь возможность очистить историю страниц, по которым я просматривал, если захочу.
Я нашел это решение, но я не хочу использовать код для этого. Я также нашел это решение но я действительно не знал, как его реализовать.
Просто оберните решение методом NavigationService.RemoveBackEntry в свойстве behavior/attached и примените его к вашему фрейму в xaml.
<Frame local:FrameNoHistoryBehavior.Enable = "True" />
И:
public static class FrameNoHistoryBehavior
{
public static bool GetEnable(DependencyObject obj)
{
return (bool)obj.GetValue(EnableProperty);
}
public static void SetEnable(DependencyObject obj, bool value)
{
obj.SetValue(EnableProperty, value);
}
// Using a DependencyProperty as the backing store for Enable. This enables animation, styling, binding, etc...
public static readonly DependencyProperty EnableProperty =
DependencyProperty.RegisterAttached("Enable",
typeof(bool),
typeof(FrameNoHistoryBehavior),
new UIPropertyMetadata(false, OnEnablePropertyChanged));
private static void OnEnablePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is Frame frame))
throw new NotSupportedException($"This behavior supports only {nameof(Frame)}");
if ((bool)e.NewValue)
{
frame.Navigated += OnFrameNavigated;
}
else
{
frame.Navigated -= OnFrameNavigated;
}
void OnFrameNavigated(object sender, NavigationEventArgs e)
{
frame.NavigationService.RemoveBackEntry();
}
}
}
Вы можете использовать метод NavigationService.RemoveBackEntry , чтобы удалить самую последнюю запись журнала из прошлой истории. Вы можете обратиться к этому ответу, чтобы использовать его.