我有一个使用Prism的模块化应用程序。将显示一个简单的窗口(shell)。 shell包含一个任务栏图标,用于调用命令以切换窗口可见性。单击TaskbarIcon会创建我的shell的新实例,而不是切换原始实例的可见性。有人知道我的代码为什么不在第一个shell上调用该方法吗?
我的引导程序
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 :(得分:0)
你并不总是使用单例shell。
在CreateShell
中,您首先获得一个 shell实例,然后将shell注册为singleton。稍后在ShowWindowCommand.Execute
中,您将获得单例实例,这与您之前解析的非单例实例不同。容器应该如何知道第一个已解析的实例稍后将用作单例?在注册为单例之前,您甚至可能已经解决了多个实例...