每次我的WPF应用程序启动时,JumpList都会重置

时间:2014-06-30 23:38:15

标签: c# wpf .net-4.5 jump-list

我在使用WPF时遇到了一些麻烦。当我将标签添加到我的app.xaml时,我可以在跳转列表中看到任务,但是当我尝试将项目添加到最近的文件列表时,我添加的新项目永远不会显示。如果我创建一个名为“Recent”的CustomCategory并手动添加JumpTask,它就会显示出来。但是,如果我重新启动应用程序,则新添加的JumpTask不再存在,只是测试任务。

澄清

最初,我遇到了JumpList.AddToRecentCategory根本无法正常工作的问题。它永远不会添加到最近的列表中。 Gayot Fow帮助解决了这个问题。但问题仍然存在,如果我手动添加一个自定义类别的JumpTask,那么所有最近的文件都会清除,如果我打开一个文件并调用addToRecent,它就不会显示出来。如果我删除xaml中声明的JumpTask,则会显示最近的文件。

XAML:

<JumpList.JumpList>
    <JumpList ShowRecentCategory="True">

        <JumpTask Title="Test" Description="Test"
                  Arguments="/test" CustomCategory="Tasks" />
    </JumpList>

</JumpList.JumpList>

添加最近项目的C#代码

var jumpList = JumpList.GetJumpList(Application.Current);
if (jumpList == null) return;

//create a jump task
var jt = new JumpTask();

jt.Title = System.IO.Path.GetFileNameWithoutExtension(FileName);
jt.Description = jt.Title;
jt.CustomCategory = jt.Title;
jt.ApplicationPath = FileName;

//JumpList.AddToRecentCategory(jt);

jt.CustomCategory = "Recent";
jumpList.JumpItems.Add(jt);

jumpList.Apply();

无论是从Visual Studio 2013(更新2)运行应用程序,还是从调试目录运行exe,都会发生这种情况。有没有人有任何想法为什么这不起作用?

我在某处读到过ClickOnce部署的应用程序无法正常工作,但在部署之前我甚至无法让它工作。

任何帮助都将不胜感激,谢谢。

更新

Gayot Fow的回答引导我用静态方法解决问题

JumpList.AddToRecentCategory(jt);

没有做任何事情。

我按如下方式更改了我的AddToRecent代码:

var jumpList = JumpList.GetJumpList(Application.Current);
if (jumpList == null) return;


string title = System.IO.Path.GetFileNameWithoutExtension(FileName);
string programLocation = Assembly.GetCallingAssembly().Location;

var jt = new JumpTask
{
    ApplicationPath = programLocation,
    Arguments = FileName,
    Description = FileName,
    IconResourcePath = programLocation,
    Title = title
};
JumpList.AddToRecentCategory(jt);


jumpList.Apply();

问题

虽然解决了最近文件的问题,但仍然无法让它与名为“任务”的自定义类别共存

在我的应用启动时,我调用此代码:

var jumpList = JumpList.GetJumpList(Application.Current);
if (jumpList != null)
{

    string title = "New Document";
    string programLocation = Assembly.GetCallingAssembly().Location;

    var jt = new JumpTask
    {
        ApplicationPath = programLocation,
        Arguments = "/new",
        Description = title,
        IconResourcePath = programLocation,
        Title = title
    };
    jumpList.JumpItems.Add(jt);

    jumpList.Apply();
}

调用此选项后,“最近”类别将消失,任何添加最近项目的调用都不会执行任何操作。但我确实看到了我的“新文档”任务:/

我接近这个完全错了吗? 感谢

1 个答案:

答案 0 :(得分:5)

这是一个用于跳转列表的工作代码片段......

在App.xaml中......

<JumpList.JumpList>
    <JumpList
    ShowFrequentCategory="False" 
    ShowRecentCategory="False"
    JumpItemsRejected="OnJumpItemsRejected" 
    JumpItemsRemovedByUser="OnJumpItemsRemoved">
    </JumpList>
</JumpList.JumpList>

在App.xaml.cs

    private void OnJumpItemsRejected(object sender, JumpItemsRejectedEventArgs e){}
    private void OnJumpItemsRemoved(object sender, JumpItemsRemovedEventArgs e){}
代码中的

......

    public object PopulateJumpList(string directoryName)
    {
        try
        {
            string programLocation = Assembly.GetCallingAssembly().Location;
            var di = new DirectoryInfo(directoryName);
            var jt = new JumpTask
            {
                ApplicationPath = programLocation,
                Arguments = directoryName,
                Description = "Run at " + directoryName,
                IconResourcePath = programLocation,
                Title = di.Name
            };
            JumpList.AddToRecentCategory(jt);
            return jt;
        }
        catch (Exception ex)
        {
            return ex;
        }
    }

此方法创建表单的跳转任务...

full executable path of the program |=> name of the directory where it was invoked

...通过静态方法AddToRecentCategory将其添加到最近的类别中。它与您将任务添加到跳转列表的本地副本的代码形成对比。必须为应用程序路径指定可执行文件的完全限定名称。此外,正如评论中所提到的,当它进入自己的安装目录时似乎效果最好,并且每次覆盖可执行文件时都会删除跳转列表。在调试模式下使用它(针对vshost.exe)将无法可靠地运行。