В настоящее время я работаю над приложением Xamarin Forms , на странице содержимого базового проекта.
На этой странице у меня есть StackLayout
, который содержит некоторые пользовательские элементы управления (с именем Accordion
), которые имеют Binding Property
( логическое ), что позволяет мне узнать, является ли их содержимое open
или close
.
Как я могу определить, какое из аккордеонов нажато и закрыть аккордеоны, для которых установлено открытие?
Я думал добавить TapHandler для каждого моего аккордеона, но мне было интересно, если есть лучшее решение для достижения этой цели.
(мне не интересно открывать нажатую, поскольку у моего элемента управления Accordion есть собственный обработчик нажатий)
Спасибо за ваш ответ.
РЕДАКТИРОВАНИЕ:
Accordion.xaml.cs:
public partial class Accordion : ContentView
{
public Accordion()
{
InitializeComponent();
IsOpen = false;
Close();
Indicator = Img;
}
//Elements
//Some properties
public static readonly BindableProperty IsOpenProperty = BindableProperty.Create(nameof(IsOpen), typeof(bool), typeof(Accordion), false, propertyChanged: IsOpenChanged);
public bool IsOpen
{
get => (bool)GetValue(IsOpenProperty);
set => SetValue(IsOpenProperty, value);
}
public static readonly BindableProperty AccordionContentProperty = BindableProperty.Create(nameof(AccordionContent), typeof(View), typeof(Accordion), default(View));
public View AccordionContent
{
get => (View)GetValue(AccordionContentProperty);
set => SetValue(AccordionContentProperty, value);
}
//Open handling
private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
IsOpen = !IsOpen;
}
public static void IsOpenChanged(BindableObject bindable, object oldValue, object newValue)
{
if(bindable != null && newValue != null)
{
var Control = (Accordion)bindable;
if(Control.IsOpen == false)
{
VisualStateManager.GoToState(Control, "Open");
Control.Close();
}
if(Control.IsOpen == true)
{
VisualStateManager.GoToState(Control, "Closed");
Control.Open();
}
}
}
public uint AnimationDuration { get; set; } = 250;
public async void Open()
{
_content.IsVisible = true;
await Task.WhenAll(
_content.TranslateTo(0, 0, AnimationDuration),
Img.TranslateTo(-20, 0, AnimationDuration),
IndicatorOpen(),
_indicator.RotateTo(0, AnimationDuration),
_content.FadeTo(30, 50, Easing.SinIn)
);
}
public async Task IndicatorOpen()
{
Img.Margin = new Thickness(0, 0, -10, 0);
return;
}
public async void Close()
{
await Task.WhenAll(
_content.TranslateTo(0, 0, AnimationDuration),
Img.TranslateTo(10, 0, AnimationDuration),
IndicatorClose(),
_indicator.RotateTo(-180, AnimationDuration),
_content.FadeTo(0, 50)
);
_content.IsVisible = false;
}
public async Task IndicatorClose()
{
Img.Margin = new Thickness(0, 0, 0, 0);
return;
}
}
TapGestureRecognizer_Tapped
- это метод, вызываемый TapHandler при нажатии на голову аккордеона.