Есть ли способ принудительно выполнить метод OnSizeAllocated? - PullRequest
1 голос
/ 03 июня 2019

Я создал вид с использованием кода Xaml. Я сделал это с помощью кода, потому что я хотел изменить макет представления в зависимости от ориентации устройства. Итак, проблема, с которой я сталкиваюсь, заключается в том, что метод OnSizeAllocated вызывается после загрузки представления. Таким образом, он не может изменить макет в соответствии с ориентацией устройства. Я просто хочу знать, есть ли способ вызвать метод OnSizeAllocated перед загрузкой представления. Пожалуйста, нажмите на ссылку ниже, чтобы посмотреть код:

Пожалуйста, нажмите здесь, чтобы посмотреть код

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

1. Перестановка страницы

Вы можете проверить, больше ли ширина, чем высота, чтобы определить, находится ли устройство в горизонтальной или вертикальной ориентации:

public partial class Page13 : ContentPage
{
    private double _width ;
    private double _height ;
    private Grid grid;
    private Label label;
    private Entry entry;
    private Button button;

    public Page13 ()
    {
        _width = this.Width;
        _height = this.Height;
        label = new Label(){Text = "i am a laber"};
        entry = new Entry(){WidthRequest = 200};
        button = new Button(){Text = "Submit"};
        grid = new Grid();
        UpdateLayout();
        StackLayout stackLayout = new StackLayout();
        stackLayout.Children.Add(grid);
        Content = stackLayout;

    }

    protected override void OnSizeAllocated(double width, double height)
    {
        base.OnSizeAllocated(width, height);
        if (_width != width || _height != height)
        {
            _width = width;
            _height = height;
            UpdateLayout();
        }
    }
    void UpdateLayout()
    {
        grid.RowDefinitions.Clear();
        grid.ColumnDefinitions.Clear();
        grid.Children.Clear();

        if (_width > _height)
        {
            ScreenRotatedToLandscape();
        }
        else
        {
            ScreenRotatedToPortrait();
        }
    }
    private void ScreenRotatedToLandscape()
    {
        grid.RowDefinitions.Add(new RowDefinition(){Height = new GridLength(1,GridUnitType.Auto)});
        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
        grid.ColumnDefinitions.Add(new ColumnDefinition(){Width = new GridLength(1,GridUnitType.Auto)});
        grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) });
        grid.Children.Add(label,0,0);
        grid.Children.Add(entry, 1, 0);
        grid.Children.Add(button, 0, 1);
        Grid.SetColumnSpan(button,2);
    }

    private void ScreenRotatedToPortrait()
    {
        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
        grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) });
        grid.Children.Add(label, 0, 0);
        grid.Children.Add(entry, 0, 1);
        grid.Children.Add(button, 0, 2);
    }
}

Это рекомендуемая реализация, взятая прямо из документации Xamarin.Forms.

2. Использование Xamarin.Essentials

Это добавляет дополнительную функциональность кросс-платформенным приложениям, созданным в Xamarin.,Одной из этих новых функций является возможность пропинговать устройство для текущей ориентации путем доступа к свойству DeviceDisplay.ScreenMetrics.Orientation.Возвращает текущую ориентацию устройства, которая может быть использована для определения макета для рендеринга.

он аналогичен приведенному выше

private bool IsPortrait;

public Page13 ()
{
     ...
     IsPortrait = DeviceDisplay.ScreenMetrics.Orientation == ScreenOrientation.Portrait;
     UpdateLayout();
     ...

}

void UpdateLayout()
{
    grid.RowDefinitions.Clear();
    grid.ColumnDefinitions.Clear();
    grid.Children.Clear();

    if (IsPortrait)
    {
        ScreenRotatedToPortrait();
    }
    else
    {
        ScreenRotatedToLandscape();
    }
}
0 голосов
/ 03 июня 2019

Вы не можете принудительно выполнить это, так как SizeAllocation не изменился, но вы можете сделать это, чтобы получить ориентацию при начальной загрузке:

  1. Если вы добавите пакет нюгететов Xamarin.Essentials, как вы можете видеть здесь, вы можете получить ориентацию, используя эту строку кода DeviceDisplay.MainDisplayInfo.Orientation, и вы получите Пейзаж, Портрет, Квадрат или Неизвестно.
  2. Если вы этого не сделаетеЧтобы добавить пакет, вы можете просто использовать Application.Current.MainPage.Width и Application.Current.MainPage.Height для определения ориентации.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...