Список переходов сбрасывается при каждом запуске моего приложения WPF

#c# #wpf #.net-4.5 #jump-list

#c# #wpf #.net-4.5 #список переходов

Вопрос:

У меня возникли некоторые проблемы с WPF. Когда я добавляю тег в свой app.xaml, я вижу задачу в списке переходов, но когда я пытаюсь добавить элемент в список последних файлов, новый элемент, который я добавляю, никогда не отображается. Если я создам пользовательскую категорию с именем «Последние» и вручную добавлю задачу перехода, она появится. Однако, если я перезапущу приложение, недавно добавленной задачи перехода больше не будет, только тестовая задача.

разъяснение

Изначально у меня были проблемы со списком переходов.AddToRecentCategory вообще не работает. Оно никогда не добавится в список последних. Gayot Fow помог решить эту проблему. Но проблема все еще существует: если я вручную добавлю JumpTask с пользовательской категорией, то все последние файлы удалятся, и если я открою файл и вызову addToRecent , он не отобразится. Если я удалю JumpTask, объявленный в xaml, отобразятся последние файлы.

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 не работают, но я даже не могу заставить его работать перед развертыванием.

Буду признателен за любую помощь, спасибо.

Обновить

Ответ Гайота Фоу привел меня к решению проблемы с помощью статического метода

 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. Список переходов не работает надежно при отладке, потому что это не тот же exe.

2. Спасибо, я учел это, но когда я запускаю exe вручную из папки, происходит то же самое. В этом случае это тот же EXE

3. После этого попробуйте «запуск от имени администратора»

4. Хорошо, я попытался запустить от имени администратора, все то же самое. Задача, объявленная в xaml, заменяет все задачи, которые я добавил вручную, например, последние файлы и список переходов. Статический метод AddToRecentCategory абсолютно ничего не делает. Возможно, мне просто придется создать свой собственный MRU и пропустить список переходов, хотя я действительно этого хочу.

5. У меня нет других идей. Я могу добавить некоторый код из одного из моих списков переходов, но я не знаю, будет ли от него какая-либо польза.

Ответ №1:

Вот фрагмент рабочего кода для списка переходов…

В 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 ) не будет работать надежно.

Комментарии:

1. Хорошо, ваш ответ привел меня к решению проблемы, из-за которой последние файлы не отображаются. Следуя вашей логике здесь, я устанавливаю ApplicationPath = в местоположение программы. Изменил описание и заголовок на имя файла, и теперь работает статический метод AddToRecentCategory. НО он по-прежнему работает некорректно, если я хочу также иметь статические элементы задачи в категории под названием «Задачи». Как только я добавлю его, последние файлы исчезнут, и они не будут добавляться. Идеи?

2. @Eric, я бы сказал, что это новый вопрос. На ваш первоначальный вопрос был дан ответ, всем неудобно, когда вы возвращаетесь и расширяете его, меняете область видимости и т.д. Пожалуйста, смотрите meta.stackexchange.com/questions/188625 /…

3. Мой первоначальный вопрос заключался в том, что если у меня есть элемент, объявленный в JumpList xaml, он отображается в списке, но вызовы AddToRecentCategory завершаются ошибкой. Это все еще происходит. Хотя раньше я никогда не мог заставить AddToRecentCategory работать вообще. Я пытался создать категорию «Недавние», потому что, по крайней мере, тогда я мог бы добавить ее, но она удалялась при каждом запуске приложения. Я не могу заставить их работать вместе. Мне нужен список задач и список последних.

4. неважно, это работает. Я понял, что мне не хватает CustomCategory из объявления. Я добавил CustomCategory=»Задачи», и это работает. Спасибо

5. @Эрик, если возможно, я хотел бы увидеть ваш код. Вопросы о списке переходов здесь редки, и полезно поделиться знаниями.