2016-03-17 98 views
0

我有一個Prism模塊化的應用程序。顯示一個簡單的窗口(shell)。該shell包含一個任務欄圖標,用於調用切換窗口可見性的命令。單擊TaskbarIcon將創建一個新的殼體實例,而不是切換原始殼體的可見性。有人知道我的代碼爲什麼不在第一個shell上調用方法嗎?切換窗口的可見性instanciates新窗口

我的引導程序

protected override DependencyObject CreateShell() 
    { 
     var shell = ServiceLocator.Current.GetInstance<Shell>(); 
     RegisterTypeIfMissing(typeof(Shell), typeof(Shell), true); 
     return shell; 

    } 

    protected override void InitializeShell() 
    { 

     var mainWindow = (Shell)this.Shell; 
     var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>(); 
     Application.Current.MainWindow = mainWindow; 
     mainWindow.Show(); 
} 

我taskbarIcon

<tb:TaskbarIcon 
      Name="ToolbarIcon" 
      IconSource="/Resources/images/icon.ico" 
      ToolTipText="Some text" 
      LeftClickCommand="{StaticResource ShowWindowCommand}"/> 

ShowWindowCommand

public class ShowWindowCommand : ICommand 
{ 
    public void Execute(object parameter) 
    { 
     ServiceLocator.Current.GetInstance<Shell>().toggleVisibility(); 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 
    public event EventHandler CanExecuteChanged; 
} 

Shell.togglingVisibility()

public void toggleVisibility() 
    { 
     if (this.Visibility == System.Windows.Visibility.Visible){ 
      this.Visibility = System.Windows.Visibility.Collapsed;     
     } 
     else 
     { 
      this.Visibility = System.Windows.Visibility.Visible; 

     } 
    } 
+0

我現在使用 「((Shell)Application.Current.MainWindow).toggleVisibility();」 在我的Command類中。它的作用像一個魅力,但我想知道第一種方法的錯誤。 – Tenobi

回答

0

你並不總是使用單殼。

CreateShell您首先得到a shell實例,然後將shell註冊爲singleton。稍後在ShowWindowCommand.Execute中,您將得到單例實例,它與您之前解決的非單實例實例不同。容器應該如何知道第一個已解決的實例稍後將被用作單例?在註冊爲單例之前,您甚至可能已經解決了多個實例...

+0

你是對的,它沒有任何意義,以任何方式創建一個shell實例之前註冊另一個單身...我已經刪除了「var shell = ...」語句並返回ServiceLocator.Current.GetInstance ()之後註冊它。現在它可以工作。謝謝! – Tenobi