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