Я создал приложение 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, чтобы заставить его вести себя так, как я хочу, или какой самый простой способ это сделать.