Проблема стека форм Xamarin

У меня есть форма с вертикальной компоновкой стека. У него двое детей. Первый (самый верхний) дочерний элемент - это Entry. Второй дочерний элемент - это список. Моя проблема в том, что я хочу, чтобы список расширялся, чтобы заполнить оставшееся пространство на экране, а затем его можно было прокручивать. За исключением установки определенной высоты для представления списка (которая, очевидно, не будет работать на экранах разных размеров), мне не удалось этого добиться. Если я установил вертикальную опцию представления списка как FillAndExpand, кажется, что он расширяется за край экрана, и вы не можете прокручивать до самых нижних записей в представлении списка. Как я могу добиться этого, не устанавливая определенную высоту? Этот макет динамически создается в C#, кстати. Вертикальным параметром макета родительского стека также является FillAndExpand.

Я пробовал использовать сетку в соответствии с предложением @KFactory. Когда я это сделал, я получил такой результат:

Проблема стека форм Xamarin

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

Это страница, на которую добавляются просмотры:

 <?xml version = "1.0" encoding = "utf-8" ?>
    <local:BaseContentPage xmlns = "http://xamarin.com/schemas/2014/forms"
                 xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:local = "clr-namespace:TecMan.MobileApp"
                 xmlns:f = "clr- 
     namespace:TecMan.MobileApp.Behaviours;assembly=TecMan.MobileApp"
                 x:Class = "TecMan.MobileApp.MainPage">
    <AbsoluteLayout x:Name = "frmLayout" HorizontalOptions = "FillAndExpand" VerticalOptions = "FillAndExpand" BackgroundColor = "LightGray">
        <StackLayout
            Orientation = "Vertical"
            HorizontalOptions = "FillAndExpand"
            VerticalOptions = "FillAndExpand">
            <Grid 
                x:Name = "frmMain" 
                HorizontalOptions = "FillAndExpand"
                VerticalOptions = "FillAndExpand"
                RowSpacing = "0">
                <local:BaseContentPage.Behaviors>
                    <f:BindingChangedBehaviour/>
                </local:BaseContentPage.Behaviors>
            </Grid>
        </StackLayout>
    </AbsoluteLayout>
    </local:BaseContentPage>

Элементы управления добавляются в сетку 'frmMain'

В коде элементы управления добавляются динамически (содержимое зависит от сценария). Строки / столбцы и расположение элементов управления в сетке определяются следующим образом:

 Grid frmMain = page as Grid;  //page.FindByName<Grid>("frmMain");
                if (frmMain == null) throw new NotImplementedException("Only support Grid");

                frmMain.ColumnDefinitions.Clear();
                frmMain.ColumnDefinitions.Add(new ColumnDefinition
                {
                     Width = new GridLength(1, GridUnitType.Star)
                });

                frmMain.RowDefinitions.Clear();
                frmMain.RowDefinitions.Add(new RowDefinition
                {
                    Height = new GridLength(1, GridUnitType.Auto)
                });
                frmMain.RowDefinitions.Add(new RowDefinition
                {
                    Height = new GridLength(1, GridUnitType.Star)
                });

            Grid.SetColumn(btnFrame, 0);
            Grid.SetRow(btnFrame, 0);

            Grid.SetColumn(oViewColumn, 0);
            Grid.SetRow(oViewColumn, 1);

Первый элемент управления - это запись, заключенная в рамку. Второй элемент управления - это настраиваемое представление списка, xaml которого:

<?xml version = "1.0" encoding = "UTF-8"?>
<ContentView xmlns = "http://xamarin.com/schemas/2014/forms" 
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class = "TecMan.MobileViewModels.Controls.CollapsibleListView"
              xmlns:local = "clr-namespace:TecMan.MobileViewModels.Controls;assembly=TecMan.MobileViewModels"  >
    <ContentView.Content
       BackgroundColor = "LightGrey" >

        <ListView
             VerticalOptions = "FillAndExpand"
             BackgroundColor = "White" 
            HasUnevenRows = "True"
            RowHeight = "-1"
            x:Name = "collapseLV"
            MinimumHeightRequest = "1000"
             ItemsSource = "{Binding Items}" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <local:CollapsibleGridView  Title = "{Binding Title}"
                                                    TitleColour = "#99ff66"  
                                                    ButtonVisible = "{Binding ButtonVisible}" 
                                                    CaptionField = "{Binding CaptionField}" 
                                                    DataField = "{Binding DataField}" 
                                                    IsHiddenField = "{Binding IsHiddenField}" 
                                                    ButtonColour = "{Binding ButtonColour}"                                                   
                                                    VisibleItemsColour = "{Binding VisibleItemsColour}" 
                                                    HiddenItemsColour = "{Binding HiddenItemsColour}" 
                                                    CellBackgroundColor = "{Binding CellBackgroundColor}" 
                                                    ImageFile = "{Binding ImageFile}"    
                                                    ItemsSource = "{Binding}">
                        </local:CollapsibleGridView>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>

        </ListView>



    </ContentView.Content>
</ContentView>

Вместо этого используйте Grid с * для GridRowHeight.

EvZ 21.05.2018 11:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
804
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Xamarin Forms (пока) не так мощен, как WPF ... Есть некоторые «неестественные» поведения. В моем случае я использую такие элементы управления сеткой:

<Grid RowSpacing = "0">
    <Grid.RowDefinitions>
        <RowDefinition Height = "Auto" />
        <RowDefinition Height = "*" />
    </Grid.RowDefinitions>

    <!-- Row 0: your entry />
    <Entry Grid.Row = "0" ... />

    <!-- Row 1: your Listview that will take all available remaining space /> 
    <Listview Grid.Row = "1"
        ...
        />
</Grid>

Обратите внимание, что для 'RowSpacing' свойство сетки установлено значение «0», чтобы избежать пустого пространства между элементами управления. Должен работать сейчас ...


Изменить 1 (полный код xaml):

<?xml version = "1.0" encoding = "utf-8" ?>
<local:BaseContentPage xmlns = "http://xamarin.com/schemas/2014/forms"
    xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local = "clr-namespace:TecMan.MobileApp"
    xmlns:f = "clr- 
     namespace:TecMan.MobileApp.Behaviours;assembly=TecMan.MobileApp"
                 x:Class = "TecMan.MobileApp.MainPage">

    <!-- Set your page's behavior here -->
    <local:BaseContentPage.Behaviors>
        <f:BindingChangedBehaviour/>
    </local:BaseContentPage.Behaviors>

    <!-- Set directly a grid as content of your page -->
    <Grid 
        x:Name = "frmMain" 
        BackgroundColor = "LightGray"
        RowSpacing = "0">

        <Grid.RowDefinitions>
            <RowDefinition x:Name = "r1" Height = "Auto" />
            <RowDefinition x:Name = "r2" Height = "*" />
        </Grid.RowDefinitions>

        <!-- Row 0: your entry />
        <Entry Grid.Row = "0" ... />

        <!-- Row 1: your Listview that will take all available remaining space /> 
        <local:CollapsibleListView 
            Grid.Row = "1"
            ...
            />

    </Grid>
</local:BaseContentPage>

В коде используйте имена строк ('r1' и 'r2') для добавления элементов управления.

НО Я предлагаю вам не смешивать XAML и код инициализации пользовательского интерфейса. ... Не совсем понятно и источник ошибок ...

Спасибо @KFactory - я пробовал то, что вы предлагали, но без радости. Пожалуйста, посмотрите на изменение моего вопроса.

David Christopher Reynolds 21.05.2018 13:08

Вам не нужен StackLayout для встраивания вашей сетки. Вам даже не нужен AbsoluteLayout. Я обновляю свой ответ полным кодом Mainpage.xaml ...

KFactory 21.05.2018 14:06

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

David Christopher Reynolds 21.05.2018 14:51

Другие вопросы по теме