c# - 在 Windows Phone 8.1 运行时覆盖 Prism 中的后退按钮

标签 c# mvvm windows-runtime windows-phone-8.1 prism

我在 Windows Phone 8.1 项目中使用适用于 WinRT 的 Prism MVVM 库。是否可以阻止通过手机后退按钮进行后退导航并在 ViewModel 中处理后退按钮按下操作?

具体场景:

  • 用户可以从项目列表中选择一个项目(“事件”项目) - 就像游戏中的玩家一样。该项目是应用程序其余功能的引用,例如数据库查询。
  • 选择一个项目会将用户返回到上一(主)页面。
  • 在同一列表中,用户还可以删除不再需要的项目。应该可以删除所有项目。

问题:如果用户删除事件项目或最后一个项目,然后点击后退按钮,我最终会得到无效的事件项目。

为了防止这种情况发生,我想取消后退按钮导航并提示用户选择或创建另一个事件项(最好是从 ViewModel 中选择或创建)。


更新:我现在已根据我对下面 Nate 评论的理解向 App.xaml.cs 添加了一个事件处理程序。这应该在应用程序范围内覆盖它:

private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame currentFrame = Window.Current.Content as Frame;
    if (currentFrame == null)
    {
        return;
    }
    if (currentFrame.Content is SelectionPage)
    {
        e.Handled = true;
    }
    else if (currentFrame.CanGoBack)
    {
        currentFrame.GoBack();
        e.Handled = true;
    }
}

并在构造函数中订阅事件:

#if WINDOWS_PHONE_APP
        HardwareButtons.BackPressed += HardwareButtons_BackPressed;
#endif

这似乎可以很好地处理后退按钮的按下,但它不会停止现有的导航。所以它在任何情况下都会返回,并且在默认情况下会返回两次。

最佳答案

这是可能的。这是解决方案(主要受到 this discussion 的启发):

创建一个允许 View 模型禁用后退导航的界面:

public interface IRevertState
{
    bool CanRevertState();
    void RevertState();
}

在 View 模型中实现接口(interface):

public class myViewModel : ViewModel, IRevertState {
public bool CanRevertState() {
    return (...) //condition under which back navigation should be disabled
}
public void RevertState() {
    (...) // optionally reset condition if required
}

在 App.Xaml.cs 中处理后退导航:

#if WINDOWS_PHONE_APP
    protected override void OnHardwareButtonsBackPressed(object sender, BackPressedEventArgs e) {
        var page = (Page)((Frame)Window.Current.Content).Content;
        if (page.DataContext is IRevertState) {
            var revertable = (IRevertState)page.DataContext;
            if (revertable.CanRevertState()) {
                revertable.RevertState();
                e.Handled = true;
                return;
            }
        }
        base.OnHardwareButtonsBackPressed(sender, e);
    }
#endif

关于c# - 在 Windows Phone 8.1 运行时覆盖 Prism 中的后退按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26410614/

相关文章:

.net - MVVM 模式中代码隐藏的实用使用

c# - MVVM ViewModel-View通讯

c# - Windows 8 : how to add user control with C# code

c# - 在 Metro 应用程序 C# 中重新加载页面

c# - 如何在 LINQ 查询的 where 子句中调用方法/函数作为 IEnumerable 对象

c# - C# 中的继承和析构函数

c# - 为什么在此示例中再次引用事件处理程序?

c# - 为什么具有默认值枚举参数的泛型类的构造函数无法调用该类的 protected 方法?

ios - SwiftUI:从嵌套 View 调用方法

java - 将 boolean 值绑定(bind)到复选框 MVVM