gpt4 book ai didi

c# - 在WPF应用程序的mvvm中实现导航的最佳方法

转载 作者:行者123 更新时间:2023-12-03 10:48:05 25 4
gpt4 key购买 nike

希望我能在这里给出清晰的问题描述,我在当前的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实例,但是当我通知Messenger调用某个事件时,它将触发两次。
例如
AppMessenger.Send(new AppMessage() { MessageType = AppMessageType.MessageBox, MessageData = "Authentication failed." });

这将显示两次MessageBox。请为此提出任何解决方案。

不知道它如何触发两次。我怎样才能防止这种情况。
有什么帮助吗?谢谢。**

最佳答案

您考虑可以为您维护 window 的另一个类(WindowManger)。您还将创建一个用于导航的新窗口。在这里,您可以从WindowManager中检查窗口是否已经存在。

关于c# - 在WPF应用程序的mvvm中实现导航的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18504445/

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