Как очистить историю переходов во фрейме при использовании окна Текущая страница в качестве модели представления Свойство для модели представления окна

Я делаю приложение 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. Я хочу выбрать, хочу ли я иметь возможность очистить историю страниц, по которым я просматривал, если захочу.

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
491
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто оберните решение методом 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();
        }
    }
}

Другие вопросы по теме