我想从我的页面捕获NavigationService.Navigating事件,以防止用户向前导航。 我这样定义了一个事件处理程序:

void PreventForwardNavigation(object sender, NavigatingCancelEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Forward)
    {
        e.Cancel = true;
    }
}

......而且工作正常。 但是,我不确定这个代码的确切位置:

NavigationService.Navigating += PreventForwardNavigation;

如果我将它放在页面的构造函数或Initialized事件处理程序中,那么NavigationService仍然为null,我得到一个NullReferenceException。 但是,如果我将它放在Page的Loaded事件处理程序中,则每次导航到页面时都会调用它。 如果我理解正确,那意味着我多次处理同一事件。

我可以多次为事件添加相同的处理程序(就像我使用页面的Loaded事件来连接它一样)? 如果没有,在Initialized和Loaded之间是否有一些地方可以进行这种布线?

===============>>#1 票数:1

@Espo您的链接帮助我找到了解决方法。 我称之为解决方法因为它很难看 ,但这就是MS自己在文档中所做的事情:

public MyPage() // ctor
{
    InitializeComponent();
    this.Loaded += delegate { NavigationService.Navigating += MyNavHandler; };
    this.Unloaded += delegate { NavigationService.Navigating -= MyNavHandler; };
}

因此,当您的页面被卸载时,您基本上必须取消订阅导航服务的事件。

为了帮助我找到它,您的回复为+1。 我似乎无法将自己的回答标记为“已接受的回答”,所以我想我现在就把它留下来。

===============>>#2 票数:1

NavigationService.Navigate触发NavigationService.Navigating事件和Application.Navigating事件。 我用以下方法解决了这个问题:

public class PageBase : Page
{
    static PageBase()
    {
        Application.Current.Navigating += NavigationService_Navigating;
    }

    protected static void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
    {
        // put your event handler code here...
    }
}

  ask by Matt Hamilton translate from so

未解决问题?本站智能推荐:

1回复

WPF / Silverlight NavigationService backstack

我正在使用WPF编写应用程序(也应该适用于Silverlight),我在主窗口中有一个Frame,我正在使用NavigationService来浏览Frame的页面。 我正在使用NavigationService.GoBack成功返回上一页,但有时我需要转到NavigationServic
1回复

注册到NavigationService以防止NavigateAway(保存更改)

如果要检测到用户尚未保存的更改,我想防止用户离开页面。 我尝试在Page上使用Unloaded方法,但是我认为这已经太晚了,不能使用e.Cancel = true来阻止导航。 我已经看到一些类似的问题,他们建议订阅NavigationService.Navigate事件并阻止通过此处
1回复

WPF-NavigationService.GoBack()和列表框SelectionChanged事件

在ADDPage.xaml页面中,有一个Back Back Button,其代码为NavigationService.GoBack(),可以返回上一页。 问题: 在另一个页面(SubPage.xaml)的列表框SelectionChanged事件中,我正在使用NavigationSe
1回复

将参数从ConfirmNavigationRequest传递到Prism中的NavigationService

我有一个实现IConfirmNavigationRequest的视图IConfirmNavigationRequest , 我需要将信息从该视图模型传递给我拥有的导航代理类,该类未与任何特定视图或视图模型耦合。 相反,导航代理类可以访问感兴趣的IRegion以及IRegionNavigat
1回复

Prism NavigationService获取以前的视图名称

目前我正在实施一个屏幕,指示模块不存在或仍在开发中。 后退按钮具有以下代码: 这是按预期工作的。 但是用户不是来自Home屏幕。 所以我需要从导航日志中的最后一个条目访问视图名称。 示例:用户来自设置屏幕=>文本应显示“返回设置屏幕”
1回复

为什么在使用NavigationService时弄乱了我的URI?

一种“简单”的情况: Assembly1包含: 几个WPF页面(.xaml) 调用程序集包含: 具有ElementHost的WinForm ElementHost包含一个WPF UserControl ,该UserControl具有单个Frame(= M
1回复

WPF:第二页访问后NavigationService为NULL

场景: 我有这样的NavigationWindow样式: 我启动我的应用程序,加载一个名为Home.xaml的页面。 在Home.xaml中,我有一个导航到另一个名为PersonalData的页面的按钮: 这工作正常,并加载PersonalData页面。 在第二页上,我
2回复

NavigationService.GoBack(); 题

当我调用NavigationService.GoBack(); 它不会重新加载页面。 例如,我有第1页,这是我的登录页面,然后导航到第2页到“设置”页面。 在第2页上保存设置后,希望它回到第1页并显示所显示的新设置。 在导航服务返回并强制页面重新初始化的地方,我可以打电话吗?
2回复

WPF NavigationService“ RemoveBackEntry”正在删除最早的条目,而不是最新的条目

我有一个相当简单的WPF应用程序,其中包含少量页面。 提交表单后,我要导航到特定页面,然后清除最后一个导航条目,以便用户无法重新提交他们刚刚提交的表单。 但是,当我导航到特定页面后在导航服务上调用“ RemoveBackEntry()”时,它将删除后退堆栈中的第三个条目(在这种情况下是最
1回复

WPF初始化问题

我有一个MyWindow类,它从Window继承。 在MyWindow ,单击“确定”按钮后即可执行以下方法: XAML: 在初始化我的UI窗口的单独类中,我说 但是,一旦执行window.Show()就会执行随后的代码,并且我实际上无法与我的窗口进行交互来完成我需要做