Приложение Metro OnSearchActivated ProgressRing не отображается

Я реализую поиск в своем приложении Metro. Поиск работает хорошо, результаты и UI соответствуют ожиданиям, но есть одна проблема.

Я пытаюсь отобразить ProgressRing перед поиском и скрыть его после завершения поиска, но он никогда не отображается.

Что мне не хватает, фрагмент кода ниже:

    protected override void OnSearchActivated(Windows.ApplicationModel.Activation.SearchActivatedEventArgs args)
    {
        // Some Metro designer generated code here

        // Show progress ring
        MainPage.Current.ResetProgressRingState(true);

        // Bind search results
        MainPage.Current.BindSearchResults(args.QueryText);

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

        // Hide progress ring
        MainPage.Current.ResetProgressRingState(false);
    }

Я подозреваю, что метод BindSearchResults нужно дождаться, чтобы ProgressRing работал правильно. Если да, то какой самый простой способ сделать этот метод ожидаемым, если нет, сообщите, что мне здесь не хватает.


person c0D3l0g1c    schedule 30.05.2013    source источник


Ответы (1)


Если да, то какой самый простой способ сделать этот метод ожидаемым, если нет, сообщите, что мне здесь не хватает.

Отметьте его как async и верните Task. В этом методе используйте await для других асинхронных операций.

person Stephen Cleary    schedule 30.05.2013
comment
Этот метод содержит много взаимодействий с пользовательским интерфейсом и не содержит асинхронных вызовов. Я могу обернуть его в await Task.Run, но там мне придется обернуть все элементы пользовательского интерфейса в вызове dispatcher.RunAsync. Мне кажется перебор. Какие-либо предложения? - person c0D3l0g1c; 31.05.2013
comment
В этот метод добавлен await Task.Delay(10). Чисто, просто, но не уверен, что это уместно. - person c0D3l0g1c; 31.05.2013
comment
Я бы не стал использовать Task.Delay. Я предполагаю, что в этом методе есть что-то, что занимает время, и поэтому вы хотите показать индикатор выполнения. Вы должны искать то, что отнимает время; распространенными виновниками являются дисковый или сетевой ввод-вывод. - person Stephen Cleary; 31.05.2013
comment
Учитывая, что это приложение Metro, я ожидаю, что ввод-вывод будет асинхронным. Я подозреваю, что виновато большое количество взаимодействий с пользовательским интерфейсом. - person Paulo Morgado; 31.05.2013