Как использовать Geolocator.RequestAccessAsync в настольном приложении WPF - PullRequest
0 голосов
/ 26 августа 2018

Я создал приложение WPF на C #, которое должно знать местоположение пользователя и в настоящее время требует, чтобы оно вводилось вручную. Я использую Desktop Bridge, чтобы он мог работать как приложение UWP. Когда оно работает как приложение UWP, я хочу использовать API-интерфейс определения местоположения Windows 10, если он включен. Я использую следующий код для запроса доступа к местоположению при запуске программы:

public static async void RequestAccess()
{
    var accessStatus = await Windows.Devices.Geolocation.Geolocator.RequestAccessAsync();

    switch (accessStatus)
    {
        case Windows.Devices.Geolocation.GeolocationAccessStatus.Allowed:
            UwpDesktop.hasLocationAccess = true;
            break;
        case Windows.Devices.Geolocation.GeolocationAccessStatus.Denied:
            UwpDesktop.hasLocationAccess = false;
            break;
        case Windows.Devices.Geolocation.GeolocationAccessStatus.Unspecified:
            MessageBox.Show("Failed to access Windows 10 location API", "Error");
            UwpDesktop.hasLocationAccess = false;
            break;
    }
}

Однако я получаю следующую ошибку при запуске приложения, если для него не разрешено местоположение:

System.Exception: «Элемент не найден. (Исключение из HRESULT: 0x80070490) '

Насколько я могу судить, причина этой ошибки заключается в том, что функция RequestAccessAsync должна выполняться в основном потоке пользовательского интерфейса UWP. Причина, по которой это происходит только в том случае, если разрешение на местоположение не включено, заключается в том, что Windows пытается запустить диалоговое окно UWP, запрашивающее, чтобы пользователь предоставил доступ к местоположению, но не может это сделать в приложении Desktop Bridge.

Мне известно о двух решениях этой проблемы. Один из них - запустить раздел «Расположение» в приложении «Настройки» и показать пользователям окно сообщения с просьбой предоставить доступ к местоположению, что может сработать, но я бы действительно предпочел использовать официальный API. Другой вариант - создать новый проект кода UWP и написать этот код там, а затем запустить его из приложения WPF.

Microsoft имеет некоторую документацию , которая должна объяснить, как сделать второй вариант, но их примеры сложны, и я не знаю, как применить их к тому, что я пытаюсь сделать. Я не хочу создавать пользовательский интерфейс XAML или фоновую службу, все, что мне нужно, это способ безопасно вызвать RequestAccessAsync и вернуть значение на основе результата. Мне интересно, действительно ли мне нужно создать проект UWP, чтобы заставить его вести себя так, как я хочу, или какой самый простой способ это сделать.

...