Xamarin.Forms: как воспроизвести этот интерфейс, который сочетает в себе встроенные макеты

Я пытаюсь воспроизвести этот интерфейс на странице: Исключенный интерфейс

Страница содержит:

  • "основной" элемент, который отображается вверху
  • "другие" элементы, которые отображаются внизу в 2 столбцах

Я уже могу отобразить изображение основного элемента и других элементов с XAML, которое выглядит следующим образом:

<ScrollView>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="450" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <!-- Main item  -->
        <StackLayout MinimumHeightRequest="450" HeightRequest="450">
            <ffil:CachedImage Source="{Binding MainProduct.Icon}"      
                              MinimumHeightRequest="450" HeightRequest="450" 
                              Aspect="AspectFill"/>
        </StackLayout>

        <!-- Other items -->
        <!-- through the use of 2 Repeaters -->
    </Grid>
</ScrollView>

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

Я добавил вторичную сетку, которая находится в первой строке существующей сетки, потому что я надеялся, что это поможет мне показать соответствующее содержимое основного элемента на изображении:

<ScrollView>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="450" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <!-- Main item  -->
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="**" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>                   
            <StackLayout MinimumHeightRequest="450" HeightRequest="450"
                        Grid.ColumnSpan="2" Grid.RowSpan="2">
                <ffil:CachedImage Source="{Binding MainProduct.Icon}" 
                                  MinimumHeightRequest="450" HeightRequest="450" 
                                  Aspect="AspectFill"/>
            </StackLayout>
            <Frame BackgroundColor="Black"
                   Opacity="0.75"
                   Margin="10"
                   VerticalOptions="End" HorizontalOptions="End"
                   Grid.Column="1" Grid.Row="1">
                <StackLayout>
                    <Label Text="{Binding MainProduct.Title}" 
                           HorizontalOptions="StartAndExpand" VerticalTextAlignment="Center"/>
                    ...
                </StackLayout>
            </Frame>
        </Grid>

        <!-- Other items -->
        <!-- through the use of 2 Repeaters -->
    </Grid>
</ScrollView>

Что не так в моем XAML? Есть ли лучший способ добиться этого через RelativeLayout или AbsoluteLayout?

редактировать

ошибка следующая:

{System.Reflection.TargetInvocationException: исключение было сгенерировано целью вызова. ---> System.FormatException: один из идентифицированных элементов был в недопустимом формате. в Xamarin.Forms.GridLengthTypeConverter.ConvertFromInvariantString (значение System.String) [0x000a0] в C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\GridLengthTypeConverter.cs.Tignpe.TinkTect2.Tink.Tect2. ] в C:\Projets\MyProject\MyProjectNewUi\DevMyProjectNewUi\tablet\MyProjectTablet\MyProjectTablet\obj\Debug\MyProjectTablet.Views.ListProductPage.xaml.g.cs:21 в MyProjectTablet.Views.ListProductPage000) () в C:\Projets\MyProject\MyProjectNewUi\DevMyProjectNewUi\tablet\MyProjectTablet\MyProjectTablet\Views\ListProductPage.xaml.cs:24 в (управляемая оболочка является родной) System.Reflection.MonoCMethod:InternalInvoke (System.oeflection. object,object[],System.Exception&) в System.Reflection.MonoCMethod.InternalInvoke (параметры System.Object obj, System.Object[]) [0x00002] в <657aa8fea4454dc898a9e5f379c58734>:0 --- Отслеживание конца стека внутренних исключений - - в System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, параметры System.Object []) [0x00017] в <657aa8fea4454dc898a9e5f379c58734>: 0 в System.RuntimeType.CreateInstanceMono (System.Boolean nonPublic) [0x000a8 publicOnly, System.Boolean, skipCheckThis, System.Boolean, fillCache, System.Threading.StackCrawlMark& ​​stackMark) [0x00009] в <657aa8fea4454dc898a9e5f379c58734>: 0 в System.RuntimeTooleCooleCef.BeCleBile System.Threading.StackCrawlMark & ​​stackMark) [0x00027] в <657aa8fea4454dc898a9e5f379c58734>: 0 в System.Activator.CreateInstance (тип System.Type, System.Boolean, непубличный) System..Type type) [0x00000] в <657aa8fea4454dc898a9e5f379c58734>: 0 в MobileCommon.Services.NavigationService.CreatePage (MobileCommon.Services.PageType pageType, параметр System.Object e)) [0x00053] в C:\Projets\MyProject\MyProjectNewUi\DevMyProjectNewUi\mobile\MobileCommon\Services\NavigationService.cs:118 }

Я не понимаю, почему я получаю исключение, связанное с GridLengthTypeConverter...

1 ответ

Решение

Проблема на самом деле совсем другая - вы случайно использовали ** вместо * как в одном из ColumnDefinitions:

<ColumnDefinition Width="**" />

Чтобы проиллюстрировать, как я это заметил, рассмотрим трассировку стека исключений. Вы можете видеть, что вторая строка говорит Xamarin.Forms.GridLengthTypeConverter.ConvertFromInvariantString (System.String value), Это указывает на источник ошибки довольно хорошо.

Чтобы получить n:1 соотношение размеров столбцов, нужно написать n* где n это число, а не **,, лайк:

<ColumnDefinition Width="2*" />
Другие вопросы по тегам