Как я могу заблокировать вращение, чтобы разрешить только портретный режим в формах xamarin?

#c# #xamarin.forms #device-orientation

#c# #xamarin.forms #ориентация устройства

Вопрос:

Мне нужно заблокировать вращение на определенной странице, и это должно работать как для Android, так и для iOS.

Я пытался использовать плагин NuGet.Ориентация устройства и добавление следующего кода

 protected override void OnAppearing()
        {
            base.OnAppearing();
            if (CrossDeviceOrientation.IsSupported) 
                CrossDeviceOrientation.Current.LockOrientation(Plugin.DeviceOrientation.Abstractions.DeviceOrientations.Portrait);
        }


protected override void OnDisappearing()
        {
            base.OnDisappearing();
            if (CrossDeviceOrientation.IsSupported) 
                CrossDeviceOrientation.Current.UnlockOrientation();
        }
  

но выдает исключение:
System.NullReferenceException: ‘Ссылка на объект не установлена для экземпляра объекта.’

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

1. iOS или Android? Вы включили плагин как в проекты shard, так и в platform?

2. оба, и плагин включен для обоих тоже

3. github.com/wcoder/Xamarin . Плагин. DeviceOrientation /проблемы/22

4. Описание кода серьезности Ошибка состояния подавления строки файла проекта NU1202 Package Plugin. CurrentActivity 2.1.0.4 несовместим с netstandard2.0 (.NETStandard, Version= v2.0). Плагин пакета. CurrentActivity 2.1.0.4 поддерживает: monoandroid44 (MonoAndroid, версия = v4.4)

Ответ №1:

Для Xamarin.Формы, вы могли бы обслуживать зависимости.

Создайте интерфейс:

  public interface IRotate
{
    void ForcePortrait();
}
  

Android:

 [assembly: Xamarin.Forms.Dependency(typeof(RoateHandler))]
namespace RotatePage.Droid
{
class RoateHandler : IRotate
{
    public void ForcePortrait()
    {
        ((Activity)Forms.Context).RequestedOrientation = ScreenOrientation.Portrait;
    }
}
}
  

iOS:

 [assembly: Xamarin.Forms.Dependency(typeof(RoateImplementation))]
namespace RotatePage.iOS
{
class RoateImplementation : IRotate
{
    public void ForcePortrait()
    {
        UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.Portrait), new NSString("orientation"));
    }
}
}
  

Использование:

DependencyService.Get().ForcePortrait();

Скриншот:

введите описание изображения здесь

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

1. Ошибка CS0246 Не удалось найти тип или имя пространства имен ‘RoateHandler’ (вам не хватает директивы using или ссылки на сборку?) Я думал, что «Roate» была опечаткой, но попробовал «Rotate» и ошибка тоже, ха-ха. Нужно ли добавлять Nuget или ссылку?

2. RoateHandler Создается в части Android. Я обновил свой проект. Вы могли бы проверить на GitHub. github.com/WendyZang/Test/tree/master/RotatePage

3. Спасибо, я смог попробовать это, поскольку блокирует все страницы, а не только те, где я использую line DependencyService. Получить<iRotate>().ForcePortrait();

4. Измените ответ именно на то, что я искал 🙂