Переключение видимости записи по нажатию кнопки - Xamarin Forms

Мне нужна помощь в сортировке видимости записи по нажатию кнопки. Я пробовал несколько разных вещей. и следующий код - лучший результат, который я получил до сих пор. Но и это не идеально.

Требование: когда страница отображается на экране, на ней видна только кнопка, а когда пользователь нажимает на кнопку, он отображает запись, и если он снова нажимает на кнопку, запись должна быть установлена ​​на невидимость. Если я щелкну снаружи, где на странице, он также должен скрыть запись.

XAML.

 <controls:CustomButton 
           Text="Submit" 
           TextColor="White"  
           HorizontalOptions="FillAndExpand" 
           Command="{Binding TextSubmitCommand}"
           Icon="WhiteKeyboard"/>

           <controls:CustomEntry 
                    x:Name="ItemEntry"
                    TextColor="White"                                    
                    HeightRequest="50"
                    HorizontalTextAlignment="Center"
                    VerticalOptions="Center"
                    IsVisible="{Binding EntryVisible, Mode=TwoWay}">
                    <controls:CustomEntry.Behaviors>
                        <behaviors:EventToCommand 
                            Command="{Binding LocationSearchCommand}"
                            EventName="Completed"/>
                    </controls:CustomEntry.Behaviors>
                   <controls:CustomEntry.Triggers>
                        <DataTrigger TargetType="controls:CustomEntry"
                                     Binding="{Binding EntryVisible}"
                                     Value="true">
                           <Trigger.EnterActions>
                                <triggers:EntryFocusTrigger/>
                            </Trigger.EnterActions>
                        </DataTrigger>
                    </controls:CustomEntry.Triggers>
                </controls:CustomEntry>

Посмотреть модель

    public bool EntryVisible { get; set; } = false;

    public Command TextSubmitCommand
    {
        get
        {
            return new Command(() =>
            {
                EntryVisible = !EntryVisible;
            });
        }
    }

Спусковой крючок

 public class EntryFocusTrigger : TriggerAction<CustomEntry>
 {
    protected override void Invoke(CustomEntry entry)
    {
        entry.Focus();
    }
 }

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

Добавил следующий xaml к пользовательской записи в (страница XAML)

<EventTrigger Event="Unfocused">
    <triggers:EntryUnfocusTrigger />
</EventTrigger>

и фактический триггер определяется как:

public class EntryUnfocusTrigger : TriggerAction<CustomEntry>
{
    public bool IsVisible { get; set; }

    protected override void Invoke(CustomEntry entry)
    {
        if(entry.IsFocused == false){
            entry.IsVisible = false;
        }
    }
}

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

1 ответ

Попробуйте добавить это Trigger скрыть, когда запись не сфокусирована:

<Trigger TargetType="controls:CustomEntry"
        Property="IsFocused" Value="False">
    <Setter Property="IsVisible" Value="false" />
</Trigger>

С этим вам не нужен пользовательский класс Trigger.

Надеюсь это поможет.-

Другие вопросы по тегам