Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xaml 表单:如何在2个滚动布局上方和之间定位圆形图像_Xaml_User Interface_Xamarin.forms_Scrollview_Frame - Fatal编程技术网

Xaml 表单:如何在2个滚动布局上方和之间定位圆形图像

Xaml 表单:如何在2个滚动布局上方和之间定位圆形图像,xaml,user-interface,xamarin.forms,scrollview,frame,Xaml,User Interface,Xamarin.forms,Scrollview,Frame,我使用的是一个Xamarin.Forms应用程序,其中包含一个主页,基于: 屏幕顶部背景的图像 在滚动视图中显示的项目列表 如果列表包含许多信息,则滚动视图可以恢复图像 这看起来像这样: <Grid RowSpacing="0" BackgroundColor="{StaticResource Gray-050}"> <Grid.RowDefinitions> <RowDefinit

我使用的是一个Xamarin.Forms应用程序,其中包含一个主页,基于:

  • 屏幕顶部背景的
    图像
  • 滚动视图中显示的项目列表
如果列表包含许多信息,则
滚动视图
可以恢复
图像

这看起来像这样:

<Grid RowSpacing="0"
        BackgroundColor="{StaticResource Gray-050}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Row="1">
        <!--  Header view  -->
        <ScrollView>
            <ContentView x:Name="headerView"
                         HorizontalOptions="FillAndExpand"
                         VerticalOptions="FillAndExpand">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <!-- the BoxView will be replaced by an Image -->
                    <BoxView x:Name="headerImage"
                                HeightRequest="280"
                                BackgroundColor="Yellow" />
                </Grid>
            </ContentView>
        </ScrollView>

        <!--  List view  -->
        <ScrollView HorizontalOptions="FillAndExpand"
                    VerticalOptions="FillAndExpand">
            <Grid ColumnSpacing="0"
                  RowSpacing="0"
                  VerticalOptions="FillAndExpand">
                <Grid.RowDefinitions>
                    <RowDefinition Height="140" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid Grid.Row="1">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <!-- Main container -->
                    <yummy:PancakeView CornerRadius="16,16,0,0"
                                       Padding="0,10,0,0"
                                       BackgroundColor="{StaticResource Gray-050}"
                                       Grid.Row="1">
                        <StackLayout BackgroundColor="Transparent"
                                     Spacing="16" Margin="16">

                            <!-- Phone container -->
                            <yummy:PancakeView Style="{StaticResource YummyHomeFrame}"
                                                Padding="16">
                                <Grid RowSpacing="0">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="*" />
                                    </Grid.RowDefinitions>
                                    <Label Style="{StaticResource HomePageHeaderLabelStyle}"
                                            Text="Phone Number" />
                                    <Label Grid.Row="1"
                                            Style="{StaticResource HomePageLabelStyle}"
                                            Text="+33 6 20 10 70 40"  />
                                </Grid>
                            </yummy:PancakeView>

                            <!-- Other containers -->

                        </StackLayout>
                    </yummy:PancakeView>
                </Grid>
            </Grid>
        </ScrollView>
    </Grid>
</Grid>

XAML如下所示:

<Grid RowSpacing="0"
        BackgroundColor="{StaticResource Gray-050}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Row="1">
        <!--  Header view  -->
        <ScrollView>
            <ContentView x:Name="headerView"
                         HorizontalOptions="FillAndExpand"
                         VerticalOptions="FillAndExpand">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <!-- the BoxView will be replaced by an Image -->
                    <BoxView x:Name="headerImage"
                                HeightRequest="280"
                                BackgroundColor="Yellow" />
                </Grid>
            </ContentView>
        </ScrollView>

        <!--  List view  -->
        <ScrollView HorizontalOptions="FillAndExpand"
                    VerticalOptions="FillAndExpand">
            <Grid ColumnSpacing="0"
                  RowSpacing="0"
                  VerticalOptions="FillAndExpand">
                <Grid.RowDefinitions>
                    <RowDefinition Height="140" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid Grid.Row="1">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <!-- Main container -->
                    <yummy:PancakeView CornerRadius="16,16,0,0"
                                       Padding="0,10,0,0"
                                       BackgroundColor="{StaticResource Gray-050}"
                                       Grid.Row="1">
                        <StackLayout BackgroundColor="Transparent"
                                     Spacing="16" Margin="16">

                            <!-- Phone container -->
                            <yummy:PancakeView Style="{StaticResource YummyHomeFrame}"
                                                Padding="16">
                                <Grid RowSpacing="0">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="*" />
                                    </Grid.RowDefinitions>
                                    <Label Style="{StaticResource HomePageHeaderLabelStyle}"
                                            Text="Phone Number" />
                                    <Label Grid.Row="1"
                                            Style="{StaticResource HomePageLabelStyle}"
                                            Text="+33 6 20 10 70 40"  />
                                </Grid>
                            </yummy:PancakeView>

                            <!-- Other containers -->

                        </StackLayout>
                    </yummy:PancakeView>
                </Grid>
            </Grid>
        </ScrollView>
    </Grid>
</Grid>

我想在两个
滚动视图
之间显示一个圆形徽标,就在
主容器
上方,类似这样:

<Grid RowSpacing="0"
        BackgroundColor="{StaticResource Gray-050}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Row="1">
        <!--  Header view  -->
        <ScrollView>
            <ContentView x:Name="headerView"
                         HorizontalOptions="FillAndExpand"
                         VerticalOptions="FillAndExpand">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <!-- the BoxView will be replaced by an Image -->
                    <BoxView x:Name="headerImage"
                                HeightRequest="280"
                                BackgroundColor="Yellow" />
                </Grid>
            </ContentView>
        </ScrollView>

        <!--  List view  -->
        <ScrollView HorizontalOptions="FillAndExpand"
                    VerticalOptions="FillAndExpand">
            <Grid ColumnSpacing="0"
                  RowSpacing="0"
                  VerticalOptions="FillAndExpand">
                <Grid.RowDefinitions>
                    <RowDefinition Height="140" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid Grid.Row="1">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <!-- Main container -->
                    <yummy:PancakeView CornerRadius="16,16,0,0"
                                       Padding="0,10,0,0"
                                       BackgroundColor="{StaticResource Gray-050}"
                                       Grid.Row="1">
                        <StackLayout BackgroundColor="Transparent"
                                     Spacing="16" Margin="16">

                            <!-- Phone container -->
                            <yummy:PancakeView Style="{StaticResource YummyHomeFrame}"
                                                Padding="16">
                                <Grid RowSpacing="0">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="*" />
                                    </Grid.RowDefinitions>
                                    <Label Style="{StaticResource HomePageHeaderLabelStyle}"
                                            Text="Phone Number" />
                                    <Label Grid.Row="1"
                                            Style="{StaticResource HomePageLabelStyle}"
                                            Text="+33 6 20 10 70 40"  />
                                </Grid>
                            </yummy:PancakeView>

                            <!-- Other containers -->

                        </StackLayout>
                    </yummy:PancakeView>
                </Grid>
            </Grid>
        </ScrollView>
    </Grid>
</Grid>

但我还没有做到这一点,我也不知道是否有可能…

你可以尝试一下

下面是类似的示例代码:

<ScrollView HorizontalOptions="FillAndExpand"
                VerticalOptions="FillAndExpand">
        <Grid ColumnSpacing="0"
                RowSpacing="0"
                VerticalOptions="FillAndExpand">
            <Grid.RowDefinitions>
                <RowDefinition Height="140" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid Grid.Row="1">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <!-- Main container -->
                <RelativeLayout>
                    <Frame CornerRadius="16" x:Name="MainFrame"
                                    Padding="0,10,0,0"
                                    BackgroundColor="LightBlue"
                                    Grid.Row="1">
                    <StackLayout BackgroundColor="Transparent"
                                    Spacing="16"
                                    Margin="16">

                        <!-- Phone container -->
                        <Frame Padding="16">
                            <Grid RowSpacing="0">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*" />
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>
                                <Label Text="Phone Number" />
                                <Label Grid.Row="1"
                                        Text="+33 6 20 10 70 40" />
                            </Grid>
                        </Frame>

                        <!-- Other containers -->

                    </StackLayout>
                </Frame>
                    <BoxView CornerRadius="25"
                                BackgroundColor="AliceBlue"
                                RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView, ElementName=MainFrame, Property=Width,Factor=0.45}"
                                RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=MainFrame, Property=Y,Constant=-20}"
                                RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToView, ElementName=MainFrame,  Constant=100}"
                                RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToView, ElementName=MainFrame, Constant=100}" />
                </RelativeLayout>
            </Grid>
        </Grid>
</ScrollView>

其效果是:

您可以尝试一下

下面是类似的示例代码:

<ScrollView HorizontalOptions="FillAndExpand"
                VerticalOptions="FillAndExpand">
        <Grid ColumnSpacing="0"
                RowSpacing="0"
                VerticalOptions="FillAndExpand">
            <Grid.RowDefinitions>
                <RowDefinition Height="140" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid Grid.Row="1">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <!-- Main container -->
                <RelativeLayout>
                    <Frame CornerRadius="16" x:Name="MainFrame"
                                    Padding="0,10,0,0"
                                    BackgroundColor="LightBlue"
                                    Grid.Row="1">
                    <StackLayout BackgroundColor="Transparent"
                                    Spacing="16"
                                    Margin="16">

                        <!-- Phone container -->
                        <Frame Padding="16">
                            <Grid RowSpacing="0">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*" />
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>
                                <Label Text="Phone Number" />
                                <Label Grid.Row="1"
                                        Text="+33 6 20 10 70 40" />
                            </Grid>
                        </Frame>

                        <!-- Other containers -->

                    </StackLayout>
                </Frame>
                    <BoxView CornerRadius="25"
                                BackgroundColor="AliceBlue"
                                RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView, ElementName=MainFrame, Property=Width,Factor=0.45}"
                                RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=MainFrame, Property=Y,Constant=-20}"
                                RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToView, ElementName=MainFrame,  Constant=100}"
                                RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToView, ElementName=MainFrame, Constant=100}" />
                </RelativeLayout>
            </Grid>
        </Grid>
</ScrollView>

其效果是:


在容器的同一层添加圆形徽标

                <!--  Items view  -->
                <ScrollView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                    <Grid
                        ColumnSpacing="0"
                        RowSpacing="0"
                        VerticalOptions="FillAndExpand">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="140" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Grid Grid.Row="1">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>

                            <!--  Container  -->
                            <Frame ...>

                            <!--  Yoour logo -->
                            <Frame
                                Grid.Row="1"
                                Margin="0,-40,0,0"
                                BackgroundColor="Green"
                                CornerRadius="40"
                                HeightRequest="40"
                                HorizontalOptions="Center"
                                VerticalOptions="Start"
                                WidthRequest="40" />
                        </Grid>
                    </Grid>
                </ScrollView>

查看演示:

因为我没有使用nugget包,所以我只是用一个框架替换了pancake视图。您可以根据需要调整徽标大小、边距

顺便说一句,您的结构有点复杂或冗余,可以是4级主结构,如下所示:

<Grid x:Name="mainGrid">

  <!--  Header view  -->
  <BoxView (or Image).../>

  <!--  Items view  -->
  <ScrollView ...>
    <Grid ...>

      <!--  Container  -->
      <Frame ...>

      <!--  logo  -->
      <Frame (or Image)...>

    </Grid>
  </ScrollView>
</Grid>

在容器的同一层添加圆形徽标

                <!--  Items view  -->
                <ScrollView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                    <Grid
                        ColumnSpacing="0"
                        RowSpacing="0"
                        VerticalOptions="FillAndExpand">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="140" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <Grid Grid.Row="1">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>

                            <!--  Container  -->
                            <Frame ...>

                            <!--  Yoour logo -->
                            <Frame
                                Grid.Row="1"
                                Margin="0,-40,0,0"
                                BackgroundColor="Green"
                                CornerRadius="40"
                                HeightRequest="40"
                                HorizontalOptions="Center"
                                VerticalOptions="Start"
                                WidthRequest="40" />
                        </Grid>
                    </Grid>
                </ScrollView>

查看演示:

因为我没有使用nugget包,所以我只是用一个框架替换了pancake视图。您可以根据需要调整徽标大小、边距

顺便说一句,您的结构有点复杂或冗余,可以是4级主结构,如下所示:

<Grid x:Name="mainGrid">

  <!--  Header view  -->
  <BoxView (or Image).../>

  <!--  Items view  -->
  <ScrollView ...>
    <Grid ...>

      <!--  Container  -->
      <Frame ...>

      <!--  logo  -->
      <Frame (or Image)...>

    </Grid>
  </ScrollView>
</Grid>

谢谢@Shaw和@Junior Jiang-MSFT

有两种解决方案:带有不带
相对值

没有
RelativeLayout
的版本由@Shaw给出

<Grid RowSpacing="0"
        BackgroundColor="LightGray"
        x:Name="mainGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Row="1">
        <!--  Header view  -->
        <ScrollView>
            <ContentView x:Name="headerView"
                            HorizontalOptions="FillAndExpand"
                            VerticalOptions="FillAndExpand">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <!-- the BoxView can be replaced by an Image -->
                    <BoxView x:Name="headerImage"
                                HeightRequest="280"
                                BackgroundColor="Yellow" />
                </Grid>
            </ContentView>
        </ScrollView>
            <!-- Content View -->
        <ScrollView HorizontalOptions="FillAndExpand"
                    VerticalOptions="FillAndExpand">
            <Grid ColumnSpacing="0"
                    RowSpacing="0"
                    VerticalOptions="FillAndExpand">
                <Grid.RowDefinitions>
                    <RowDefinition Height="140" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid Grid.Row="1">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <!-- Frame Container-->
                    <Frame x:Name="MainFrame"
                            CornerRadius="16"
                            Padding="0,10,0,0"
                            BackgroundColor="LightGray"
                            Grid.Row="1">
                        <StackLayout BackgroundColor="Transparent"
                                        Spacing="16" Margin="16,48,16,16">
                            <!-- Phone Frame -->
                            <Frame Padding="16">
                                <Grid RowSpacing="0">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="*" />
                                    </Grid.RowDefinitions>
                                    <Label Text="Phone Number" />
                                    <Label Grid.Row="1"
                                            Text="+33 6 20 10 70 40"  />
                                </Grid>
                            </Frame>
                            <!-- Other Frames -->
                            <!-- ... -->
                        </StackLayout>
                    </Frame>
                    <!-- No RelativeLayout positioned item -->
                    <BoxView Grid.Row="1"
                                CornerRadius="45"
                                BackgroundColor="DarkBlue"
                                WidthRequest="90" HeightRequest="90"
                                VerticalOptions="Start" HorizontalOptions="Center"
                                Margin="0,-45,0,0" />
                </Grid>
            </Grid>
        </ScrollView>
    </Grid>
</Grid>

谢谢@Shaw和@Junior Jiang-MSFT

有两种解决方案:带有不带
相对值

没有
RelativeLayout
的版本由@Shaw给出

<Grid RowSpacing="0"
        BackgroundColor="LightGray"
        x:Name="mainGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid Grid.Row="1">
        <!--  Header view  -->
        <ScrollView>
            <ContentView x:Name="headerView"
                            HorizontalOptions="FillAndExpand"
                            VerticalOptions="FillAndExpand">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <!-- the BoxView can be replaced by an Image -->
                    <BoxView x:Name="headerImage"
                                HeightRequest="280"
                                BackgroundColor="Yellow" />
                </Grid>
            </ContentView>
        </ScrollView>
            <!-- Content View -->
        <ScrollView HorizontalOptions="FillAndExpand"
                    VerticalOptions="FillAndExpand">
            <Grid ColumnSpacing="0"
                    RowSpacing="0"
                    VerticalOptions="FillAndExpand">
                <Grid.RowDefinitions>
                    <RowDefinition Height="140" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid Grid.Row="1">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <!-- Frame Container-->
                    <Frame x:Name="MainFrame"
                            CornerRadius="16"
                            Padding="0,10,0,0"
                            BackgroundColor="LightGray"
                            Grid.Row="1">
                        <StackLayout BackgroundColor="Transparent"
                                        Spacing="16" Margin="16,48,16,16">
                            <!-- Phone Frame -->
                            <Frame Padding="16">
                                <Grid RowSpacing="0">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="*" />
                                    </Grid.RowDefinitions>
                                    <Label Text="Phone Number" />
                                    <Label Grid.Row="1"
                                            Text="+33 6 20 10 70 40"  />
                                </Grid>
                            </Frame>
                            <!-- Other Frames -->
                            <!-- ... -->
                        </StackLayout>
                    </Frame>
                    <!-- No RelativeLayout positioned item -->
                    <BoxView Grid.Row="1"
                                CornerRadius="45"
                                BackgroundColor="DarkBlue"
                                WidthRequest="90" HeightRequest="90"
                                VerticalOptions="Start" HorizontalOptions="Center"
                                Margin="0,-45,0,0" />
                </Grid>
            </Grid>
        </ScrollView>
    </Grid>
</Grid>

你是想把circ