希望我可以在这里给出一个明确的问题描述,我在我当前的WPF应用程序分配中实现MVVM。实现WPF应用程序导航mvvm的最佳方式
我所做的是,我创建了一个继承Window的基类,然后每隔一个窗口继承这个类。
public class ApplicationScreenBase : Window
{
public ApplicationScreenBase()
{
AppMessenger.Register(this, OnMessageToApp);
this.Unloaded += ApplicationScreenBase_Unloaded;
}
private void ApplicationScreenBase_Unloaded(object sender, RoutedEventArgs e)
{
AppMessenger.Unregister(this, OnMessageToApp);
}
private void OnMessageToApp(AppMessage message)
{
switch (message.MessageType)
{
case AppMessageType.Navigate:
{
var CurrentWindow = Activator.CreateInstance(Locator.NavigationPageLocator.LocateNavigateTypeByEnum((NavigationScreens)message.MessageData)) as Window;
CurrentWindow.Show();
this.Close();
break;
}
case AppMessageType.NewWindow:
{
var CurrentWindow = Activator.CreateInstance(Locator.NavigationPageLocator.LocateNavigateTypeByEnum((NavigationScreens)message.MessageData)) as Window;
CurrentWindow.Show();
break;
}
case AppMessageType.MessageBox:
{
MessageBox.Show(message.MessageData.ToString());
break;
}
case AppMessageType.Close:
{
this.Close();
break;
}
default:
break;
}
}
}
这是我的导航类返回我要打开的窗口类型。
public static class NavigationPageLocator
{
public static Type LocateNavigateTypeByEnum(NavigationScreens navigationPage)
{
switch (navigationPage)
{
case NavigationScreens.LoginOnline:
return typeof(LoginOnline);
case NavigationScreens.MainWindow:
return typeof(MainWindow);
case NavigationScreens.Home:
return typeof(Home);
}
return default(Type);
}
}
这是我如何使用AppMessenger
public enum AppMessageType
{
Navigate,
NewWindow,
Close,
MessageBox
}
public class AppMessage
{
public AppMessageType MessageType { get; set; }
public object MessageData { get; set; }
}
public class AppMessenger
{
public static void Register(object recipient, Action<AppMessage> action)
{
Messenger.Default.Register<AppMessage>(recipient, action);
}
public static void Unregister(object recipient, Action<AppMessage> action)
{
Messenger.Default.Unregister<AppMessage>(recipient, action);
}
public static void Send(AppMessage message)
{
Messenger.Default.Send<AppMessage>(message);
}
这好歹是我控制从ViewModel-
AppMessenger.Send(new AppMessage() { MessageType = AppMessageType.Navigate, MessageData = NavigationScreens.Home });
流**现在的问题是我注册窗口和成功我发现AppMessenger的一个实例是注册到每个窗口,但是当我通知使者调用某个事件时,它会触发两次。 例如
AppMessenger.Send(new AppMessage() { MessageType = AppMessageType.MessageBox, MessageData = "Authentication failed." });
这将显示两个时间MessageBox。请为此提出任何解决方案。
不知道它是如何发射两次。我如何防止这一点。 有什么帮助吗?谢谢。**
谢谢请检查我的问题我发现我的问题中有新东西 –