【问题标题】:JumpList resets everytime my WPF app starts每次我的 WPF 应用程序启动时 JumpList 都会重置
【发布时间】:2023-11-27 08:32:01
【问题描述】:

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

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

我是不是完全错了? 谢谢

【问题讨论】:

  • 跳转列表在debug下不可靠,因为不是同一个exe。
  • 谢谢,我已经考虑过了,但是当我从文件夹中手动运行 exe 时,也会发生同样的事情。在那种情况下,它是同一个 EXE
  • 之后,尝试“以管理员身份运行”
  • 好的,我尝试以管理员身份运行,还是一样。 xaml 中声明的任务替换了我手动添加的任何任务,例如最近的文件,而 JumpList.AddToRecentCategory 静态方法完全没有任何作用。我可能只需要推出自己的 MRU 并跳过 JumpList,虽然我真的很想要。
  • 我没有其他想法。我可以从我的跳转列表中添加一些代码,但我不知道它有什么用。

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


【解决方案1】:

这是一个用于跳转列表的工作代码的 sn-p...

在 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)将无法可靠地工作。

【讨论】:

  • 好的,您的回答引导我解决最近文件未显示的问题。按照您的逻辑,我将 ApplicationPath = 设置为程序的位置。将描述和标题更改为文件名,现在 AddToRecentCategory 静态方法有效。但是,如果我还想在名为“任务”的类别中拥有静态任务项,它仍然无法正常工作。一旦我添加它,最近的文件就消失了,他们不会添加。想法?
  • @Eric,我会说这是一个新问题。你原来的问题已经回答了,回头扩展,改范围等大家都不好意思了,请看meta.stackexchange.com/questions/188625/…
  • 我最初的问题是,如果我在 JumpList xaml 中声明了一个项目,它会显示在列表中,但对 AddToRecentCategory 的调用失败。这仍在发生。尽管在此之前我根本无法让 AddToRecentCategory 工作。我曾尝试创建一个“最近”类别,因为至少那时我可以添加它,但每次应用程序启动时它都会清除。我不能让两者一起工作。我需要一个任务列表和最近的列表。
  • 没关系,它正在工作。我意识到我错过了声明中的 CustomCategory。我添加了 CustomCategory="Tasks" 并且它有效。谢谢
  • @Eric,如果可能的话,我想看看你的代码。这里的跳转列表问题很少见,分享知识是件好事。