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





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 - я пробовал то, что вы предлагали, но без радости. Пожалуйста, посмотрите на изменение моего вопроса.
Вам не нужен StackLayout для встраивания вашей сетки. Вам даже не нужен AbsoluteLayout. Я обновляю свой ответ полным кодом Mainpage.xaml ...
Абсолютная компоновка была виновата - как только я удалил, все было в порядке. Я не смешиваю xaml и код позади в обычном порядке, но в этом сценарии я генерирую динамические представления, которые помещаются в этот заполнитель xaml. Спасибо за вашу помощь.
Вместо этого используйте Grid с * для GridRowHeight.