3

有点卡在这里。我有一个 splitview 应用程序,它在 Appx.cs 中按下后键时具有向后导航事件。

我想在 splitviews 内容页面内导航的页面之一中定义不同的操作(例如,当某个元素可见以关闭元素时)但是应用程序始终遵循 appx.cs 中设置的事件,并忽略该事件在内容框架中加载的页面中。这是 appx.cs 中的代码:

protected async override void OnLaunched(LaunchActivatedEventArgs e)
{
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (Window.Current.Content == null)
    {
        // Create a Frame to act as the navigation context and navigate to the first page
        _rootFrame = new Frame();
        _rootFrame.NavigationFailed += OnNavigationFailed;
        _rootFrame.Navigated += OnNavigated;

        if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
        {
            //TODO: Load state from previously suspended application
        }

        // Place the frame in the current Window
        Window.Current.Content = new MainPage(_rootFrame);

        // Register a handler for BackRequested events and set the
        // visibility of the Back button
        SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;

        SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
            _rootFrame.CanGoBack ?
            AppViewBackButtonVisibility.Visible :
            AppViewBackButtonVisibility.Collapsed;
    }
}

private void OnBackRequested(object sender, BackRequestedEventArgs e)
{
    if (_rootFrame != null && _rootFrame.CanGoBack)
    {
        e.Handled = true;
        _rootFrame.GoBack();

    }
}

这是加载到 splitviews 内容窗格中的页面之一中的代码:

public CalcOutputPage()
{
    this.InitializeComponent();


    // add page specific handling of back navigation when entering this page
    SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
}

// page specific back button navigation
private void OnBackRequested(object sender, BackRequestedEventArgs e)
{

    if (MobileStackPanel.Visibility == Visibility.Visible)
    {
       MobileStackPanel.Visibility = Visibility.Collapsed;
        e.Handled = true;
    }
    else
    {
        e.Handled = false;
    }
}

但这行不通。如果它的第一页加载到导航堆栈中,它就可以工作,但在所有其他时间,应用程序都遵循 appx.cs 中的导航说明

所以澄清一下:

  • Appx.cs 中的 OnBackRequested 方法正在处理我的应用程序中的后退导航。
  • 我在 splitview 内容窗格中打开了一个页面(我们称之为 PageTwo.xaml)。
  • 在 PageTwo.xaml 中,我希望在按下 OnBackRequested 时有一个事件
  • 我现在不能,因为 Appx.cs 中的那个是总是被调用的那个
  • 我想知道是否有办法让 PageTwo.xaml.cs 页面中的 OnBackRequested 触发,而不是 Appx.cs 页面中的 OnBackRequested。

任何帮助,将不胜感激。我正在失去理智试图让这个工作:P

4

1 回答 1

7

事件处理程序的触发顺序与它们添加的顺序相同,所以这方面没有运气。一种替代方法是制作自己的事件,包装原始事件。在App.xaml.cs

public event EventHandler<BackRequestedEventArgs> BackRequested;

private void OnBackRequested(object sender, BackRequestedEventArgs e)
{
    // Raise child event
    var eventHandler = this.BackRequested;

    if (eventHandler != null)
    {
        eventHandler(sender, e);
    }

    if (!e.Handled)
    {
        if (_rootFrame != null && _rootFrame.CanGoBack)
        {
            e.Handled = true;
            _rootFrame.GoBack();

        }
    }
}

然后在您的页面中,订阅子事件而不是主事件:

((App)(App.Current)).BackRequested += OnBackRequested;

离开页面时请务必取消订阅该事件,否则您可能会导致内存泄漏。

于 2015-09-17T17:59:11.327 回答