如何在使用窗口"当前页面"作为窗口"视图模型"的视图模型属性时清除框架中的导航历



我正在为销售制作一个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时都会创建一个新页面。我想要的是选择是否能够清除我浏览过的页面的历史记录。

我找到了这个解决方案,但我不想使用代码隐藏来做到这一点。我也找到了这个解决方案,但我真的不知道如何实现它

只需在behavio/attached属性中使用NavigationService.RemoveBackEntry方法包装解决方案,并将其应用于xaml中的Frame。

<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();
}
}
}

最新更新