xamarin 表单 - ios - listview header 出现在它应该...显示空格的下方?

xamarin forms - ios - listview header appearing below where it should... showing whitespace?

晚安,

我的 ios 上的 UI 有问题。在 android -

上工作正常

在显示订单列表的管理页面上,当用户单击每个订单右侧的“*”时,它会打开一个弹出窗口 window...显示订单详细信息...问题与弹出窗口内的布局

因此,您可以从下图中的订单详细信息屏幕中看到。在 Android 上,订单详细信息显示为弹出窗口,布局中的一切都非常整洁....但是 ios 上的同一屏幕导致列表视图 header 出现在应有的位置下方。 .在弹出窗口的顶部留下白色 space?

尝试更改布局但似乎无法弄清楚...请问有人看出我做错了什么吗? 塔

//AdminPage.xaml
<Button Grid.Column="4" Grid.Row="0" VerticalOptions="Start"  Clicked="ShowMore" Text="*" CommandParameter="{Binding OrderModel_Id}"/>

//AdminPage.cs
 private void ShowMore(object Sender, EventArgs e)
        {
            Button button = (Button)Sender;
            string OrderId = button.CommandParameter.ToString();

            PopupNavigation.Instance.PushAsync(new PopupView(int.Parse(OrderId)));
        }

//popUp.cs
 public partial class PopupView 
    {
        public ObservableCollection<OrderDetails_Model> PreviousOrderDetails_ForUser { get; set; }

        OrdersDatabase_Controller RecentOrders_Controller = new OrdersDatabase_Controller();

        public PopupView(int Id)
        {
            try
            {
                InitializeComponent();

                List<OrderDetails_Model> RecentOrderDetails_List = RecentOrders_Controller.GetAllOrderDetails_ById(Id);
                PreviousOrderDetails_ForUser = new ObservableCollection<OrderDetails_Model>(RecentOrderDetails_List as List<OrderDetails_Model>);

                int countOfOrderDetailRecords = PreviousOrderDetails_ForUser.Count;
                int startingHeight = 100;
                var tempHeightofStack_SearchResults = countOfOrderDetailRecords * 40;

                //height of popup is adjusted depending on amount of products in order
                StackSearchResultsOuter.HeightRequest = startingHeight + tempHeightofStack_SearchResults;

                BindingContext = this;
            }
            catch (Exception ex)
            {
                Crashes.TrackError(ex);
            }
        }
    }

//PopUp.Xaml
 <StackLayout x:Name="StackSearchResultsOuter" BackgroundColor="White" HorizontalOptions="Center" VerticalOptions="Center" >
        <StackLayout.Resources>
            <converters:ProductIdToProductNameConverter x:Key="converter"/>
        </StackLayout.Resources>
            <ListView ItemsSource="{Binding PreviousOrderDetailsForUser}" HasUnevenRows="True" SeparatorVisibility="None">

                <ListView.Header>
                    <Frame>
                        <Grid>

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

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="30*" />
                                <ColumnDefinition Width="25*" />
                                <ColumnDefinition Width="25*" />
                                <ColumnDefinition Width="20*" />
                            </Grid.ColumnDefinitions>

                            <Label Grid.Column="0" Grid.Row="0" Text="Product"
                           HorizontalOptions="Center"/>
                        <Label Grid.Column="1" Grid.Row="0" 
                       Text="Quantity"
                           HorizontalOptions="Center"/>
                        <Label Grid.Column="2" Grid.Row="0" 
                       Text="Price"
                           HorizontalOptions="Center"/>
                        <Label Grid.Column="3" Grid.Row="0" 
                       Text="Sub"
                           HorizontalOptions="Center"/>

                            <BoxView Grid.Row="1"
                             Grid.ColumnSpan="4"
                             HeightRequest="1"
                             BackgroundColor="LightGray"/>


                        </Grid>
                    </Frame>
                </ListView.Header>

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Grid Padding="10" RowSpacing="10" ColumnSpacing="10">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="43*" />
                                    <ColumnDefinition Width="8*" />
                                    <ColumnDefinition Width="25*" />
                                    <ColumnDefinition Width="24*" />
                                </Grid.ColumnDefinitions>
                                <Label Grid.Column="0" Text="{Binding OrderModel_Id}" VerticalOptions="End"/>
                            <Label Grid.Column="1" Grid.Row="0" Text="{Binding User_Name}" VerticalOptions="End"/>
                            <Label Grid.Column="0" Grid.Row="0" HorizontalOptions="StartAndExpand" VerticalOptions="StartAndExpand" Text="{Binding Product_Id, Converter={StaticResource converter}}"/>
                                <Label Grid.Column="1" Grid.Row="0" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Text="{Binding Quantity}"/>
                                <Label Grid.Column="2" Grid.Row="0" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Text="{Binding PriceOf_Item, StringFormat='£{0:0.00}'}"/>
                                <Label Grid.Column="3" Grid.Row="0" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Text="{Binding SubtotalForThis_Item, StringFormat='£{0:0.00}'}"/>
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>


    </pages:PopupPage>

在您的屏幕截图中,我看到 iOS 屏幕区域更高。

在这两个平台上,默认是在屏幕中“垂直居中”弹出。

它不是特定于平台的。如果您制作更高或更矮的 android 模拟器,您会发现它的位置也会以类似的方式发生变化。

它在更高的平台上看起来“不对”,因为它既没有整齐地隐藏在原始文本的下方,也没有居中于“空白区域”——它居中于屏幕本身。


要调整它使其在空白区域居中,试试这个:

<StackLayout x:Name="StackSearchResultsOuter" BackgroundColor="Transparent" ...
    <BoxView x:Name="InvisibleSpacer" BackgroundColor = "Transparent"
        HeightRequest="80" />
    <ListView BackgroundColor="White" ...

根据需要调整 InvisibleSpacer 的 HeightRequest。为了准确起见,在不同的设备上,您必须使用隐藏代码,并测量您正在用这个不可见区域模仿的“Order User ...”视图的高度。超出此答案的范围。

注意:对于这个简单的任务,不需要 BoxView;您可以改为调整 Top Margin。我展示了 BoxView,因为知道如何注入空白区域是一项有用的技术。与 Margin 不同,BoxView 有自己的 BackgroundColor,这有时很有用。它也有自己的IsVisible,所以你可以根据条件控制它是否存在。 (当 IsVisible="False" 时,StackLayout 不会为其分配任何高度;就好像它的高度为零一样。)


“使其整洁”的另一种方法是将 StackSearchResultsOuterVerticalOptions 设置为“开始”(或“结束”),然后设置其顶部(或底部)保证金将其向上或向下推。因此,与其居中,不如从顶部(或底部)有一些固定的偏移量,这看起来令人愉悦。

再次使用BackgroundColor="Transparent",这样边距区域就看不见了。