我在做使用MVVM的wpf項目。 我在App.xaml.cs文件中使用override OnStartup,因爲我使用NavigationService clas以在頁面之間導航。 問題是在App.xaml文件中找到的ResourceDictionary未加載,因此我無法使用Locator。這裏是我的代碼 -ResourceDictionary無法加載,因爲覆蓋OnStartup
App.xaml文件:
<Application x:Class="TalkBackClient2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" d1p1:Ignorable="d" xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006">
<Application.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:TalkBackClient2.ViewModel" />
</ResourceDictionary>
App.xaml.cs文件:
public partial class App : Application
{
Navigation.NavigationService nav;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
nav = new Navigation.NavigationService();
}
}
的NavigationService文件:
namespace TalkBackClient2.Navigation
{
class NavigationService
{
#region fields
private const WindowsEnum FirstScreen = WindowsEnum.LoginScreen;
private MainWindow mainWindow = new MainWindow();
private LoginScreen loginScreen = new LoginScreen();
private RegistrationScreen registrationScreen = new RegistrationScreen();
private ChatScreen chatViewModel = new ChatScreen();
private GameScreen gameScreen = new GameScreen();
#endregion
public NavigationService()
{
Messenger.Default.Register<NavMessage>(this, navToPage);
openWindow(FirstScreen);
}
private void navToPage(NavMessage navMessage)
{
if (navMessage.NavFrom != WindowsEnum.MainWindow)
{
CloseWindow(navMessage.NavFrom);
}
openWindow(navMessage.NavToPage);
}
private void CloseWindow(WindowsEnum navFrom)
{
switch (navFrom)
{
case WindowsEnum.LoginScreen:
loginScreen.Hide();
break;
case WindowsEnum.GameScreen:
gameScreen.Hide();
break;
case WindowsEnum.RegistrationScreen:
registrationScreen.Hide();
break;
case WindowsEnum.ChatScreen:
chatViewModel.Hide();
break;
case WindowsEnum.MainWindow:
mainWindow.Hide();
break;
default:
break;
}
}
private void openWindow(WindowsEnum navTo)
{
switch (navTo)
{
case WindowsEnum.RegistrationScreen:
if (registrationScreen == null)
{
registrationScreen = new RegistrationScreen();
}
registrationScreen.Show();
break;
case WindowsEnum.GameScreen:
if (gameScreen == null)
{
gameScreen = new GameScreen();
}
gameScreen.Show();
break;
case WindowsEnum.ChatScreen:
if (chatViewModel == null)
{
chatViewModel = new ChatScreen();
}
chatViewModel.Show();
break;
case WindowsEnum.MainWindow:
mainWindow = new MainWindow();
var dataContext = (MainWindowViewModel)mainWindow.DataContext;
dataContext.Greeting = $"Greeting {Util.LoggedInUser.UserName}";
mainWindow.Show();
break;
case WindowsEnum.LoginScreen:
default:
if (loginScreen == null)
{
loginScreen = new LoginScreen();
}
loginScreen.Show();
break;
}
}
}
}
你的意思是寫 ? 如果是這樣,就沒有應用程序標籤,因爲我可以看到.. –
nop i meean''然後在您使用標籤的資源中' ' –
我嘗試了你的建議,但我得到一個運行時錯誤 - 「找不到名爲'locator'的資源。資源名稱是區分大小寫的。「雖然它顯然有resourse(intellisense認出它) 我認爲,確認它覆蓋OnStartup碰巧之前資源被加載 –