2015-11-03 46 views
0

我在做使用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; 
     } 
    } 
    } 
} 

回答

0

HAV e您試圖在app標籤中定義名稱空間xmlns:vm而不是在viewModel標籤中?

+0

你的意思是寫? 如果是這樣,就沒有應用程序標籤,因爲我可以看到.. –

+0

nop i meean''然後在您使用標籤的資源中'' –

+0

我嘗試了你的建議,但我得到一個運行時錯誤 - 「找不到名爲'locator'的資源。資源名稱是區分大小寫的。「雖然它顯然有resourse(intellisense認出它) 我認爲,確認它覆蓋OnStartup碰巧之前資源被加載 –

0

我只是對同樣的問題感到困惑。在玩了一段時間後(使用.NET 4.5.2),似乎有兩種可能的解決方案(還有更多的困惑,因爲我還沒有找到背景爲什麼他們會工作)。

第一個解決方案:處理啓動事件,而不是覆蓋OnStartup。 顯然,在事件處理程序中打開窗口時,ResourceDictionary會在窗口之前加載並可用。

解決方法二(我一個解釋真的很好奇):把你的資源,資源字典是你的應用程序資源的合併資源字典裏面。在這種情況下,即使覆蓋OnStartup,合併的ResourceDictionary中的資源也可用於您的窗口。

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary> 
       [... your resource here ...] 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

也許任何人都可以提供關於WPF應用程序啓動機制的更多細節,可以清除它。