Xamarin Forms получают абсолютное значение от GridLength Star или Auto - PullRequest
0 голосов
/ 01 сентября 2018

Я хочу использовать Grid тип макета, чтобы определить маленький квадрат в нижнем углу экрана моего телефона.

Я пытаюсь сделать это, получив ширину столбца в методе OnAppearing в выделенном фрагменте кода и используя его для установки высоты строки.

В Xaml я сделал это:

<Grid x:Name         ="iconGrid"
      BackgroundColor="Green">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="9*" />
        <ColumnDefinition Width="1.9*" />
        <ColumnDefinition Width="0.1*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="5*" />
        <RowDefinition Height="4.9*" />
        <RowDefinition Height="0.1*" />
    </Grid.RowDefinitions>
    <Frame BackgroundColor="Purple"
           Grid.Row       ="1"
           Grid.Column    ="1" />
</Grid>

А потом в OnAppearing я сделал это:

    protected override async void OnAppearing()
    {
        base.OnAppearing();

        iconGrid.RowDefinitions[1].Height = new GridLength(iconGrid.ColumnDefinitions[1].Width.Value);
        iconGrid.RowDefinitions[2].Height = new GridLength(iconGrid.ColumnDefinitions[2].Width.Value);
        var remainingHeight = iconGrid.Height - iconGrid.RowDefinitions[2].Height.Value - iconGrid.RowDefinitions[2].Height.Value;
        iconGrid.RowDefinitions[0].Height = new GridLength(remainingHeight);

        Debug.WriteLine("rows: " + iconGrid.RowDefinitions[0].Height + ", " + iconGrid.RowDefinitions[1].Height + ", " + iconGrid.RowDefinitions[2].Height);
    }

Мой отладочный вывод:

rows: 811.8.Absolute, 1.9.Absolute, 0.1.Absolute

Таким образом, из результатов отладки похоже, что я просто получаю star значения ширины столбца и буквально использую их как абсолютные значения для строк, что, конечно, не не работает

Мне нужно получить на экране абсолютные значения для столбцов и использовать их в качестве абсолютных значений для строк.

Итак, короче говоря, мне нужно получить фактическую точку на экране для столбцов, которые были определены как звездные типы. Это возможно? Кажется, должно быть.

1 Ответ

0 голосов
/ 01 сентября 2018

Думаю, я заблудился во всех твоих желаниях и тоже потерял себя ... Извини, об этом.

Получение абсолютных значений с дисплеев хорошо. Сложно, но есть новый Nuget-пакет, который еще находится в предварительной версии, называется Xamarin.Essentials, который позволит вам получить ширину и высоту телефона. и на основе вашего дизайна должно быть довольно легко определить нужный вам размер.

Чтобы установить пакет Nuget Xamarin.Essential, начните с галочки: Включить предварительный выпуск.

Добавить к коду:

using Xamarin.Essentials;

Вы можете получить ориентацию, вращение, плотность, ширину и высоту, и последнее не изменяется при вращении - если эмулятор Android Genymotions можно в это поверить.

var metrics = DeviceDisplay.ScreenMetrics;
// Orientation (Landscape, Portrait, Square, Unknown)
var orientation = metrics.Orientation;
// Rotation (0, 90, 180, 270)
var rotation = metrics.Rotation;
// Width (in pixels)
var width = metrics.Width;
// Height (in pixels)
var height = metrics.Height;
// Screen density
var density = metrics.Density;

Из того, что я могу сказать, он дает вам доступную высоту страницы, то есть с вычитаемой высотой любого меню сверху.

Подробнее об этом здесь: https://docs.microsoft.com/en-us/xamarin/essentials/?context=xamarin/xamarin-forms

--- Оригинальный пост "Относительный макет" ---

<RowDefinition 
RelativeLayout.HeightConstraint="{ConstraintExpression 
Type=RelativeToParent,
Property=Height,
Factor=0.1,
Constant=0}" />

<ColumnDefinition 
RelativeLayout.WidthConstraint="{ConstraintExpression 
Type=RelativeToParent, 
Property=Heigth, 
Factor=0.1,
Constant=0}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...