gpt4 book ai didi

mvvm - 当我使用 MVVM 模式和 MVVM Light 单击返回按钮时,如何返回预览页面?

转载 作者:行者123 更新时间:2023-12-03 10:16:07 27 4
gpt4 key购买 nike

我有一个测试应用程序来测试 windows phone 8.1 上的导航,我可以从主页到第二页进入第二页。

问题是,当我单击后退按钮时,我返回桌面屏幕并且应用程序进入后台,所以我必须按住后退按钮才能返回应用程序。

我已经看到了覆盖 backButtonKeyPressed 事件的示例,但这是在页面后面的代码中,所以这不适合我的情况,因为我想使用 MVVM。

在我的应用程序中,控制 goBack 事件的代码位于 NavigationServe 中。

真的,我找不到在 MVVM 中解决这个问题的好例子。使用 MVVM Light 不是强制性的,如果有任何其他使用 MVVM 模式的方式,对我有好处。

谢谢。

最佳答案

这是我实现的导航服务。不会声称它是完美的,但它对我有用。这也早于 MVVM Light 5 中的内置导航服务,但您仍然可以使用它,或者它的一部分。

使用在 ViewModelLocator 中注册它
SimpleIoc.Default.Register<INavigationService, NavigationService>();
然后通过构造函数将其注入(inject)到您的 View 模型中。使用NavigateTo()导航到其他页面;后退按钮按下处理程序仅在没有更多历史记录时退出应用程序,否则导航到上一页。

public interface INavigationService
{
void NavigateTo(Type pageType, object parameter = null);

void NavigateTo(string pageName, object parameter = null);

void GoBack();
}

.
public class NavigationService : INavigationService
{
#region Public

/// <summary>
/// Navigates to a specified page.
/// </summary>
public void NavigateTo(string pageName, object parameter = null)
{
Type pageType = Type.GetType(string.Format("SendToSync.{0}", pageName));

if (pageType == null)
throw new Exception(string.Format("Unknown page type '{0}'", pageName));

NavigateTo(pageType, parameter);
}

/// <summary>
/// Navigates to a specified page.
/// </summary>
public void NavigateTo(Type pageType, object parameter = null)
{
var content = Window.Current.Content;
var frame = content as Frame;

if (frame != null)
{
var previousPageType = frame.Content.GetType();

if (previousPageType != pageType)
NavigationHistory.Add(previousPageType);

//await frame.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => frame.Navigate(pageType));

frame.Navigate(pageType, parameter);
}

Window.Current.Activate();
}

/// <summary>
/// Goes back.
/// </summary>
public void GoBack()
{
var content = Window.Current.Content;
var frame = content as Frame;

if (frame != null)
{
var currentPageType = frame.Content.GetType();

// remove the previous page from the history

var previousPageType = NavigationHistory.Last();
NavigationHistory.Remove(previousPageType);

// navigate back

frame.Navigate(previousPageType, null);
}
}

#endregion

#region Private

/// <summary>
/// The navigation history.
/// </summary>
private List<Type> NavigationHistory { get; set; }

#endregion

#region Initialization

public NavigationService()
{
NavigationHistory = new List<Type>();

HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}

/// <summary>
/// Called when the back button is pressed; either navigates to the previous page or exits the application.
/// </summary>
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
if (NavigationHistory.Count == 0)
{
e.Handled = false;
}
else
{
e.Handled = true;
GoBack();
}
}

#endregion
}

编辑:这是我的 ViewModelLocator 的一部分

在构造函数中:
SimpleIoc.Default.Register<MainViewModel>();
以及附带的属性:
public MainViewModel MainViewModel
{
get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
}

这将始终返回 MainViewModel 的相同单个实例(并且 View 模型数据将持续存在)。

关于mvvm - 当我使用 MVVM 模式和 MVVM Light 单击返回按钮时,如何返回预览页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34534241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com