Xamarin Forms: программно добавлен AbsoluteLayout, не рендеринг на iOS - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь программно добавить ActivityIndicator в мои страницы контента Xamarin, которые осуществляют доступ к данным.У меня весь код отлично работает ниже на моем устройстве Android (Samsung Galaxy Tab A).Когда я пошел протестировать его на своем iOS (iPhone 7), он не рендерил ни одну из страниц, обернутых в AbsoluteLayout.Я упростил репо до этого проекта, который демонстрирует проблему.

Полный проект находится здесь: https://github.com/wadebaird/absoluteLayoutIssue

Вот основы, у меня есть ContentPage ниже, из которых я программно добавляю кнопки к «MainPageStackLayout» во время OnAppearing.

<?xml version="1.0" encoding="utf-8" ?>
<absolutelayoutissue:CommonContentPage
             xmlns:absolutelayoutissue="clr-namespace:AbsoluteLayoutIssue"
             xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AbsoluteLayoutIssue.AbsoluteLayoutProgrammatic">
    <absolutelayoutissue:CommonContentPage.Content>
        <ScrollView>
            <StackLayout x:Name="MainPageStackLayout" VerticalOptions="Start" Margin="20, 20" Spacing="25">
                <Label FontSize="Large" FontAttributes="Bold" Margin="20" TextColor="Red" HorizontalTextAlignment="Center" 
                   Text="No network connection detected, please enable a connection to use this application." 
                   IsVisible="False" />
            </StackLayout>
        </ScrollView>
    </absolutelayoutissue:CommonContentPage.Content>
</absolutelayoutissue:CommonContentPage>

Во время конструктора я вызываю этот метод, чтобы программно добавить AbsoluteLayout, который оборачивает ActivityIndicator и метку:

public void AddActivityIndicator()
{
    var content = this.Content;
    var overlay = new AbsoluteLayout
    {
        HorizontalOptions = LayoutOptions.FillAndExpand,
        VerticalOptions = LayoutOptions.FillAndExpand,
    };

    var activityIndicator = new ActivityIndicator
    {
        IsEnabled = true,
        HorizontalOptions = LayoutOptions.FillAndExpand,
        //Use the same color as the school text color as it should contrast the background the same.
        Color = Color.Black,
    };

    var activityMessage = new Label
    {
        IsEnabled = true,
        HorizontalOptions = LayoutOptions.FillAndExpand,
        TextColor = Color.Black,
        Text = "Loading...",
    };

    var stackLayout = new StackLayout();
    stackLayout.Children.Add(activityIndicator);
    stackLayout.Children.Add(activityMessage);

    activityIndicator.SetBinding(ActivityIndicator.IsVisibleProperty, nameof(ViewModel.IsBusy));
    activityIndicator.SetBinding(ActivityIndicator.IsRunningProperty, nameof(ViewModel.IsBusy));
    activityMessage.SetBinding(Label.IsVisibleProperty, nameof(ViewModel.IsBusy));

    AbsoluteLayout.SetLayoutFlags(content, AbsoluteLayoutFlags.All);
    AbsoluteLayout.SetLayoutBounds(content, new Rectangle(0f, 0f, 1, 1));
    AbsoluteLayout.SetLayoutFlags(stackLayout, AbsoluteLayoutFlags.PositionProportional);
    AbsoluteLayout.SetLayoutBounds(stackLayout, new Rectangle(0.5, 0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize));

    overlay.Children.Add(content);
    overlay.Children.Add(stackLayout);

    this.Content = overlay;
}

Когда это сделано, страница загружается как полностью пустая.Когда я моделирую страницу, а программно добавляю AbsoluteLayout, все прекрасно работает:

<?xml version="1.0" encoding="utf-8" ?>
<absolutelayoutissue:CommonContentPage
             xmlns:absolutelayoutissue="clr-namespace:AbsoluteLayoutIssue"
             xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AbsoluteLayoutIssue.AbsoluteLayoutModeled">
    <absolutelayoutissue:CommonContentPage.Content>
        <AbsoluteLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
            <ScrollView AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1">
                <StackLayout x:Name="MainPageStackLayout" VerticalOptions="Start" Margin="20, 20" Spacing="25">
                    <Label FontSize="Large" FontAttributes="Bold" Margin="20" TextColor="Red" HorizontalTextAlignment="Center" 
                   Text="No network connection detected, please enable a connection to use this application." 
                   IsVisible="False" />
                </StackLayout>
            </ScrollView>
            <StackLayout AbsoluteLayout.LayoutFlags="PositionProportional" AbsoluteLayout.LayoutBounds="0.5,0.5,-1,-1">
                <ActivityIndicator IsEnabled="True" HorizontalOptions="FillAndExpand" Color="Black" IsVisible="{Binding IsBusy}" IsRunning="{Binding IsBusy}" />
                <Label IsEnabled="True" HorizontalOptions="FillAndExpand" TextColor="Black" Text="Loading..." IsVisible="{Binding IsBusy}"/>
            </StackLayout>
        </AbsoluteLayout>
    </absolutelayoutissue:CommonContentPage.Content>
</absolutelayoutissue:CommonContentPage>

Однако я не хочу моделировать ее, поскольку хочу добавить этот код на лету на любой странице.в моем приложении.

Итак, вопрос в том, может ли кто-нибудь увидеть разницу между моей смоделированной страницей и моей программно построенной?Если нет, кто-нибудь видел эту проблему раньше?Кажется, я не могу найти какие-либо настройки в AbsoluteLayout, чтобы обойти это.

Заранее спасибо.

1 Ответ

0 голосов
/ 04 октября 2018

После дня, когда я попытался выяснить это, я обнаружил, что переключение порядка установки AbsoluteLayout на Page.Content и добавление его потомков решило проблему рендеринга / макета:

overlay.Children.Add(content);
overlay.Children.Add(stackLayout);

this.Content = overlay;

должно быть так:

this.Content = overlay;

overlay.Children.Add(content);
overlay.Children.Add(stackLayout);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...