我在 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/