随着月底的临近,正忙于完成一些最后的收尾工作。尽管如此,确实想要更新一下当前项目的状态,并给予Windows 7一些关注!非常喜欢Windows 7,并且过去曾经写过一些关于使用其特性的文章……现在是时候将想法付诸实践了。
在第三部分中,提到了在这个项目中使用的导航“框架”……更新了这个“框架”,使其能够自动地向JumpList添加NavigationPoints。让回顾一下:
要注册一个NavigationPoint:
C# _navigationService.RegisterNavigationPoint(
new NavigationPoint()
{
Name = "Sales",
Category = "Main",
ShowInJumpList = true,
Icon = "\\Images\\mycomputer.png"
});
这将把一个NavigationPoint添加到导航面板中。如果ShowInJumpList设置为True,那么NavigationPoint也会被添加到JumpList中。
要使JumpList工作,需要确保只有一个应用程序实例在运行,并且如果启动了新实例,它需要以某种方式将传入的参数发送回已经运行的原始版本(使用某种形式的IPC)。在原始系列文章《Windows 7任务栏解析》中,使用了Inter-process Mediator来促进这个“进程”。不过,Inter-process Mediator有一些缺陷。
话虽如此,决定尝试FishBowl应用程序中使用的SingleInstance实现。“Fishbowl将Facebook带到桌面。”要使他们的方法起作用,首先需要创建一个自定义的Main()方法(使用了这篇文档中解释的第三种方法)。
C# public static class OpenPOS_Main
{
[STAThread]
public static void Main()
{
if (SingleInstance.InitializeAsFirstInstance("OpenPOS"))
{
var application = new App();
application.InitializeComponent();
application.Run();
// 允许单实例代码执行清理操作
SingleInstance.Cleanup();
}
}
}
并将正常的Main()内容包裹在SingleInstance.InitializeAsFirstInstance中。这将确保应用程序只会真正启动一次。一旦创建了第二个实例,就会触发一个事件……然后可以在ShellViewModel中处理这个事件。
C# SingleInstance.SingleInstanceActivated +=
new EventHandler(SingleInstance_SingleInstanceActivated);
在SingleInstance_SingleInstanceActivated事件处理程序中,可以导航到新传入的“View”。
在WPF 4中,JumpList是内置的,所以不再需要Windows® API Code Pack for Microsoft® .NET Framework了……现在只需要这样做:
C# var jl = JumpList.GetJumpList(Application.Current);
这应该返回当前应用程序的JumpList……并添加或删除任何JumpTask。这是NavigationService中的CreateJumpList方法:
C# public void CreateJumpList()
{
var jl = JumpList.GetJumpList(Application.Current);
jl.JumpItems.Clear();
for (int i = _navigationPoints.Count - 1; i >= 0; i--)
{
var point = _navigationPoints[i];
if (point.ShowInJumpList)
{
jl.JumpItems.Add(new JumpTask
{
Title = point.Name,
CustomCategory = point.Category,
IconResourceIndex = 0,
IconResourcePath = Path.Combine(System.Environment.CurrentDirectory, "OpenPOS.exe"),
Arguments = point.CreateArg(),
ApplicationPath = Path.Combine(System.Environment.CurrentDirectory, "OpenPOS.exe")
});
}
}
jl.Apply();
}
只是遍历所有的NavigationPoints,对于每个ShowInJumpList设置为true的NavigationPoint,都会被添加……