Переключение видимости записи по нажатию кнопки - 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.
Надеюсь это поможет.-