Приложение UWP зависло на заставке при активации файла

У меня есть интересная проблема, которую трудно отладить, так как это происходит, когда я использую активацию файла для запуска этого приложения. Если я запускаю приложение напрямую, никаких проблем. Если я дважды щелкну связанный файл, он зависнет на заставке, даже не пройдя мимо этого (установите точку останова отладки в InitializeComponent, она даже не доходит).

Итак, что я сделал: на вкладке «Объявление манифеста» я добавил ассоциацию типов файлов к типу файлов, который я создал, и проверил, что «Открыть безопасно». Затем использовал переопределение OnNavigatedTo, чтобы перехватить имя файла, который использовался для активации. Я получаю заставку, а затем ничего.

Если я просто запускаю приложение и открываю файл изнутри, все работает. Что меня поразило, так это то, что я использую именно OnNavigatedTo в другом приложении, и оно работает безупречно.

Вот мой OnNavigatedTo:

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        var args = e.Parameter as Windows.ApplicationModel.Activation.IActivatedEventArgs;
        if (args != null)
        {
            if (args.Kind == Windows.ApplicationModel.Activation.ActivationKind.File)
            {
                var fileArgs = args as Windows.ApplicationModel.Activation.FileActivatedEventArgs;
                string strFilePath = fileArgs.Files[0].Path;
                var file = (StorageFile)fileArgs.Files[0];
                //MainPlayList is a custom object used to manipulate the playlist of stuff I'm building.
                MainPlayList = new Playlist();
                MainPlayList.InitializePlayList();
                await MainPlayList.AddImageToPlaylist(file);
             }
       }
    }

Я проверил манифест пакета для рабочего приложения и этого. Кроме названия, они идентичны. Около 18 месяцев назад кто-то упомянул, что это может быть связано с используемой как минимум версией Windows. Пробовал и это, безрезультатно.


person Francois Gagnon    schedule 22.10.2018    source источник
comment
Компоненты Initialize запускают метод Load для класса. Например, класс форм Windows будет запускать код в коде файла Designer.cs.   -  person jdweng    schedule 22.10.2018
comment
Напишите System.Diagnostics.Debugger.Launch() в файле активации, если и выполните отладку своего приложения.   -  person Access Denied    schedule 22.10.2018
comment
Это была просто точка останова, которую я использовал, чтобы начать отслеживать, куда движется приложение, если вообще куда-то. Когда я запускаю его, нет проблем, он останавливается там. Когда File Activated, я даже никуда не попадаю. Главное окно даже не создается.   -  person Francois Gagnon    schedule 22.10.2018
comment
попробуйте это, если (args.Kind == Windows.ApplicationModel.Activation.ActivationKind.File) {System.Diagnostics.Debugger.Launch();...   -  person Access Denied    schedule 22.10.2018
comment
@Отказано в доступе, пробовал. Операция не поддерживается на этой платформе.... Вместо этого я использую отладку VS2017/другие цели отладки/предварительный запуск универсального оконного приложения отладки, а затем выполняю активацию файла.   -  person Francois Gagnon    schedule 22.10.2018
comment
@Access Denied, спасибо, но я даже не дошел до того, чтобы посмотреть на аргументы. Вот что меня убивает!   -  person Francois Gagnon    schedule 22.10.2018
comment
Почему бы вам не переопределить OnFileActivated? защищенное переопределение void OnFileActivated (аргументы FileActivatedEventArgs)   -  person Access Denied    schedule 22.10.2018
comment
Это может быть в Playlist ctor или InitializePlaylist, addImageToPlayList. Подготовьте образец, демонстрирующий проблему, и опубликуйте ссылку на исходный код. В противном случае мы могли бы только догадываться, почему это может произойти.   -  person Access Denied    schedule 22.10.2018


Ответы (1)


Это означает, что приложение никогда не покидает обработчик активации в App.xaml.cs — когда приложение еще не запущено и активировано файлом, оно никогда не переходит к OnLauched и не вызывает OnActivatedметод, который вы можете переопределить — и должны — для инициализации корня Frame и активации Window. По сути, вам нужно выполнить те же шаги, что и в OnLaunched, поэтому обычно вы можете просто превратить инициализацию в метод и вызвать его как из OnLaunched, так и из OnActivated.

Например, проверьте образец AssociationLaunching на GitHub. здесь - OnFileActivated (альтернативный способ поймать активацию файла).

protected override void OnFileActivated(FileActivatedEventArgs e)
{
    Frame rootFrame = CreateRootFrame();

    if (rootFrame.Content == null)
    {
        if (!rootFrame.Navigate(typeof(MainPage)))
        {
            throw new Exception("Failed to create initial page");
        }
    }

    var p = rootFrame.Content as MainPage;
    p.NavigateToPageWithParameter(2, e);

    // Ensure the current window is active
    Window.Current.Activate();
}

Если приложение не было запущено ранее, CreateRootFrame сначала создает и устанавливает корневой фрейм, чтобы он был готов. Наконец, он использует Window.Current.Activate(), чтобы убедиться, что окно активно.

person Martin Zikmund    schedule 22.10.2018
comment
Я понимаю, Мартин, очень полезно. За исключением CreateRootFrame, который не существует в текущем контексте... Я размещаю переопределение в общедоступном частичном классе App: Application, это правильный класс? - person Francois Gagnon; 22.10.2018
comment
Да, именно потому, что вам нужно реализовать это самостоятельно - см. образец - они также делают это вручную. Метод должен делать в основном то же самое, что и в OnLaunched — проверять, есть ли корневой фрейм, и если нет, то создавать его — github.com/Microsoft/Windows-universal-samples/blob/ - person Martin Zikmund; 22.10.2018
comment
Ой! Пропустил это! Это было в Apps.xaml.cs... извините! Пока тестируем, большое спасибо за быстрый ответ! - person Francois Gagnon; 22.10.2018
comment
Большое спасибо Мартин! Работал безупречно! Чуть позже добавлю сюда мой точный код с объяснением, так как я искал это везде и не мог найти четкого ответа. Надо было образцы посмотреть.... - person Francois Gagnon; 22.10.2018
comment
Отлично, рад, что это помогло :-). Да, иногда документы должны быть более подробными. К счастью, они с открытым исходным кодом, поэтому, возможно, я внесу свой вклад, если у меня будет минутка. Удачного кодирования! - person Martin Zikmund; 22.10.2018