Представление контейнера состояния форм Xamarin, не учитывающее параметры макета - PullRequest
0 голосов
/ 11 ноября 2018

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

https://github.com/xDelivered-Patrick/Xamarin.Forms.Essentials/blob/master/Essentials/Controls/State/StateContainer.cs

При реализации мой XAML View выглядит следующим образом.

Проблема в том, что StackLayout CenterAndExpand не работает. Все виды при визуализации просто свернуты вверху.

Если я вытащу конкретный раздел из StateContainer и исключу его использование, он будет правильно отображаться. Это проблема с тем, как View отображается внутри Содержимого StateContainer?

РЕДАКТИРОВАТЬ: Вот минимальный пример: https://github.com/aherrick/StateManagementDemo

XAML:

<ContentPage.Content>

    <StackLayout x:Name="layoutWrap" VerticalOptions="FillAndExpand"
                  HorizontalOptions="FillAndExpand">

        <controls:StateContainer State="{Binding State}">
            <controls:StateCondition Is="Loading">

                <StackLayout Orientation="Vertical" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">

                    <ActivityIndicator  x:Name="loadingIndicator"
                                    IsVisible="{Binding IsBusy}"
                                    IsRunning="{Binding IsBusy}"
                  VerticalOptions="FillAndExpand"
                  HorizontalOptions="FillAndExpand" />
                </StackLayout>
            </controls:StateCondition>

            <controls:StateCondition Is="Loaded">
                <!-- actual content here -->
            </controls:StateCondition>
            <controls:StateCondition Is="Error">

                <StackLayout Orientation="Vertical" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">

                    <Label FontAttributes="Bold" Text="Oops! There was a problem."  VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand" />
                    <Button Text="Tap to Retry" Command="{Binding LoadVenuesCommand}" CommandParameter="true"   HorizontalOptions="CenterAndExpand" TextColor="White" Padding="15"  BackgroundColor="#26265E" />
                </StackLayout>
            </controls:StateCondition>
        </controls:StateContainer>
    </StackLayout>
</ContentPage.Content>

C #

[ContentProperty("Content")]
[Preserve(AllMembers = true)]
public class StateCondition : View
{
    public object Is { get; set; }
    public object IsNot { get; set; }
    public View Content { get; set; }
}

[ContentProperty("Conditions")]
[Preserve(AllMembers = true)]
public class StateContainer : ContentView
{
    public List<StateCondition> Conditions { get; set; } = new List<StateCondition>();

    // https://forums.xamarin.com/discussion/102024/change-bindableproperty-create-to-bindableproperty-create
    //public static readonly BindableProperty StateProperty = BindableProperty.Create(nameof(State), typeof(object), typeof(StateContainer), propertyChanged: StateChanged);

    public static readonly BindableProperty StateProperty = BindableProperty.Create<StateContainer, object>(x => x.State, null, propertyChanged: StateChanged);

    public static void Init()
    {
    }

    private static void StateChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var parent = bindable as StateContainer;
        parent?.ChooseStateProperty(newValue);
    }

    public object State
    {
        get { return GetValue(StateProperty); }
        set { SetValue(StateProperty, value); }
    }

    private void ChooseStateProperty(object newValue)
    {
        foreach (StateCondition stateCondition in Conditions)
        {
            if (stateCondition.Is != null)
            {
                if (stateCondition.Is.ToString().Equals(newValue.ToString()))
                {
                    Content = stateCondition.Content;
                }
            }
            else if (stateCondition.IsNot != null)
            {
                if (!stateCondition.IsNot.ToString().Equals(newValue.ToString()))
                {
                    Content = stateCondition.Content;
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 20 ноября 2018

Решение простое, но не очевидное. Добавьте HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" к объекту <local:StateContainer>. Все формы Xamarin LayoutOptions, заканчивающиеся на ... AndExpand, могут расширяться только в том случае, если это позволяет их родительский элемент. Вот почему это сработало, когда вы удалили элемент из <local:StateContainer> и поместили его непосредственно в StackLayout, для которого уже FillAndExpand было объявлено, как «разрешающее расширение».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...