Espansione di Xamarin Community Toolkit
Il controllo Xamarin.CommunityToolkit Expander
fornisce un contenitore espandibile per ospitare qualsiasi contenuto. Il controllo ha un'intestazione e un contenuto e il contenuto viene visualizzato o nascosto toccando l'intestazione Expander
. Quando viene visualizzata solo l'intestazione, l'oggetto Expander
Expander
viene compresso. Quando il Expander
contenuto è visibile, viene Expander
espanso.
Nota
Il Expander
controllo è noto per mostrare un comportamento indesiderato quando usato in un ListView
oggetto o CollectionView
. In questo momento è consigliabile non usare un Expander
oggetto in uno di questi controlli.
Gli screenshot seguenti mostrano un Expander
oggetto negli stati compressi ed espansi, con caselle rosse che indicano l'intestazione e il contenuto:
Nota
Il Expander
controllo viene completamente implementato nel codice multipiattaforma. Pertanto, è disponibile in tutte le piattaforme supportate da Xamarin.Forms.
Il Expander
controllo definisce le proprietà seguenti:
AnimationEasing
, di tipoEasing
, che rappresenta la funzione di interpolazione da applicare alExpander
contenuto quando si espande/comprime se ExpandAnimationEasing/CollapseAnimationEasing/CollapseAnimationEasing non è impostato.AnimationLength
, di tipouint
, che definisce la durata dell'animazione quando l'oggettoExpander
viene espanso/compresso. Il valore predefinito di questa proprietà è 250ms.CollapseAnimationEasing
, di tipoEasing
, che rappresenta la funzione di interpolazione da applicare alExpander
contenuto quando viene compresso.CollapseAnimationLength
, di tipouint
, che definisce la durata dell'animazione quando l'oggettoExpander
viene compresso. Se questa proprietà non è impostata, verrà applicato il valore AnimationLength.Command
, di tipoICommand
, che viene eseguito quando l'intestazioneExpander
viene toccato.CommandParameter
, di tipoobject
, ovvero il parametro passato aCommand
.Content
, di tipoView
, che definisce il contenuto da visualizzare quando siExpander
espande.ContentTemplate
, di tipo , che è il modelloDataTemplate
usato per gonfiare dinamicamente il contenuto diExpander
.ExpandAnimationEasing
, di tipoEasing
, che rappresenta la funzione di interpolazione da applicare al contenuto durante l'espansioneExpander
.ExpandAnimationLength
, di tipouint
, che definisce la durata dell'animazione quando siExpander
espande. Se questa proprietà non è impostata, verrà applicato il valore AnimationLength.ForceUpdateSizeCommand
, di tipoICommand
, che definisce il comando eseguito quando la dimensione dell'oggettoExpander
viene aggiornata. Questa proprietà usa la modalità diOneWayToSource
associazione.Header
, di tipoView
, che definisce il contenuto dell'intestazione.IsExpanded
, di tipobool
, che determina se l'oggettoExpander
è espanso . Questa proprietà usa laTwoWay
modalità di associazione e ha un valore predefinito difalse
.State
, di tipoExpandState
, che rappresenta lo stato dell'oggettoExpander
. Questa proprietà usa la modalità diOneWayToSource
associazione.TouchCaptureView
, di tipoView
, che archivia la visualizzazione responsabile dell'attivazione dell'animazione di espansione/confronto, toccando.
Queste proprietà sono supportate da BindableProperty
oggetti, che significa che possono essere destinazioni di data binding e stile.
Nota
La Content
proprietà è la proprietà contenuto della Expander
classe e pertanto non deve essere impostata in modo esplicito da XAML.
L'enumerazione ExpandState
definisce i membri seguenti:
Expanding
indica che l'oggettoExpander
è in espansione.Expanded
indica che l'oggettoExpander
viene espanso.Collapsing
indica che ilExpander
confronto è in corso.Collapsed
indica che l'oggettoExpander
è compresso.
Il Expander
controllo definisce anche un Tapped
evento generato quando l'intestazione Expander
viene toccato. Include inoltre Expander
un ForceUpdateSize
metodo che può essere chiamato per ridimensionare a livello di codice l'oggetto Expander
in fase di esecuzione.
Importante
Il expander fa parte di Xamarin.Forms ed è stato spostato in Xamarin.CommunityToolkit. Nell'ambito di tale spostamento, l'enumerazione ExpanderState
è stata rinominata in ExpandState
Creare un espansore
Nell'esempio seguente viene illustrato come creare un'istanza Expander
di in XAML:
<Expander>
<Expander.Header>
<Label Text="Baboon"
FontAttributes="Bold"
FontSize="Medium" />
</Expander.Header>
<Grid Padding="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Source="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg"
Aspect="AspectFill"
HeightRequest="120"
WidthRequest="120" />
<Label Grid.Column="1"
Text="Baboons are African and Arabian Old World monkeys belonging to the genus Papio, part of the subfamily Cercopithecinae."
FontAttributes="Italic" />
</Grid>
</Expander>
In questo esempio, l'oggetto Expander
viene compresso per impostazione predefinita e visualizza un oggetto Label
come intestazione. Toccando l'intestazione viene visualizzata l'espansione Expander
per visualizzarne il contenuto, ovvero un Grid
oggetto contenente controlli figlio. Quando l'oggetto viene espanso, toccando l'intestazione Expander
si comprime .Expander
Importante
Quando si imposta la Expander.Content
proprietà, in modo implicito o esplicito, il Expander
contenuto viene creato quando la pagina contenente viene spostata su, anche se l'oggetto Expander
viene compresso. Tuttavia, la Expander.ContentTemplate
proprietà può essere impostata sul contenuto che viene gonfiato solo quando l'espansione Expander
viene espansa per la prima volta. Per altre informazioni, vedere Creare contenuto espandibile su richiesta.
In alternativa, è possibile creare un oggetto Expander
nel codice:
Expander expander = new Expander
{
Header = new Label
{
Text = "Baboon",
FontAttributes = FontAttributes.Bold,
FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label))
}
};
Grid grid = new Grid
{
Padding = new Thickness(10),
ColumnDefinitions =
{
new ColumnDefinition { Width = GridLength.Auto },
new ColumnDefinition { Width = GridLength.Auto }
}
};
grid.Children.Add(new Image
{
Source = "http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg",
Aspect = Aspect.AspectFill,
HeightRequest = 120,
WidthRequest = 120
});
grid.Children.Add(new Label
{
Text = "Baboons are African and Arabian Old World monkeys belonging to the genus Papio, part of the subfamily Cercopithecinae.",
FontAttributes = FontAttributes.Italic
}, 1, 0);
expander.Content = grid;
Creare contenuto espandibile su richiesta
Expander
il contenuto può essere creato su richiesta, in risposta all'espansione Expander
. Questa operazione può essere eseguita impostando la Expander.ContentTemplate
proprietà su un DataTemplate
che contiene il contenuto:
<Expander>
<Expander.Header>
<Label Text="{Binding Name}"
FontAttributes="Bold"
FontSize="Medium" />
</Expander.Header>
<Expander.ContentTemplate>
<DataTemplate>
<Grid Padding="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="120"
WidthRequest="120" />
<Label Grid.Column="1"
Text="{Binding Details}"
FontAttributes="Italic" />
</Grid>
</DataTemplate>
</Expander.ContentTemplate>
</Expander>
In questo esempio il Expander
contenuto viene gonfiato solo quando l'espansione Expander
viene espansa per la prima volta.
Il vantaggio di questo approccio è che quando una pagina contiene più Expander
oggetti, il contenuto di un Expander
oggetto viene creato solo quando viene espanso per la prima volta dall'utente.
Aggiungere un indicatore di espansione
Un Image
oggetto può essere aggiunto a un'intestazione Expander
per fornire un'indicazione visiva dello stato di espansione. Un DataTrigger
oggetto può essere associato a Image
, che modifica la Source
proprietà in base al valore della Expander.IsExpanded
proprietà:
<Expander>
<Expander.Header>
<Grid>
<Label Text="{Binding Name}"
FontAttributes="Bold"
FontSize="Medium" />
<Image Source="expand.png"
HorizontalOptions="End"
VerticalOptions="Start">
<Image.Triggers>
<DataTrigger TargetType="Image"
Binding="{Binding Source={RelativeSource AncestorType={x:Type Expander}}, Path=IsExpanded}"
Value="True">
<Setter Property="Source"
Value="collapse.png" />
</DataTrigger>
</Image.Triggers>
</Image>
</Grid>
</Expander.Header>
<Expander.ContentTemplate>
<DataTemplate>
<Grid Padding="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="120"
WidthRequest="120" />
<Label Grid.Column="1"
Text="{Binding Details}"
FontAttributes="Italic" />
</Grid>
</DataTemplate>
</Expander.ContentTemplate>
</Expander>
In questo esempio viene Image
visualizzata l'icona expand
per impostazione predefinita:
La IsExpanded
proprietà diventa true
quando l'intestazione Expander
viene toccata, che comporta la visualizzazione dell'icona collapse
:
Per altre informazioni sui trigger, vedere Trigger Xamarin.Forms.
Incorporare un espansore in un espansore
Il contenuto di un oggetto Expander
può essere impostato su un altro Expander
controllo per abilitare più livelli di espansione. Il codice XAML seguente mostra un Expander
il cui contenuto è un altro Expander
oggetto:
<Expander>
<Expander.Header>
<Label Text="{Binding Name}"
FontAttributes="Bold"
FontSize="Medium" />
</Expander.Header>
<Expander Padding="10">
<Expander.Header>
<Label Text="{Binding Location}"
FontSize="Medium" />
</Expander.Header>
<Expander.ContentTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="120"
WidthRequest="120" />
<Label Grid.Column="1"
Text="{Binding Details}"
FontAttributes="Italic" />
</Grid>
</DataTemplate>
</Expander.ContentTemplate>
</Expander>
</Expander>
In questo esempio, toccando l'intestazione radice Expander
viene mostrata l'intestazione per il figlio Expander
:
Toccando l'intestazione figlio Expander
il contenuto viene gonfiato e visualizzato:
Definire l'animazione di espansione e compressione
L'animazione che si verifica quando un'espansione Expander
o comprime può essere definita impostando le ExpandAnimationEasing
proprietà e CollapseAnimationEasing
su una delle funzioni di interpolazione incluse in Xamarin.Forms o funzioni di interpolazione personalizzate. Per impostazione predefinita, le animazioni di espansione e compressione si verificano oltre 250ms. Tuttavia, queste durate possono essere modificate impostando le ExpandAnimationLength
proprietà e CollapseAnimationLength
sui uint
valori.
Il codice XAML seguente mostra un esempio di definizione dell'animazione che si verifica quando l'oggetto Expander
viene espanso o compresso dall'utente:
<Expander ExpandAnimationEasing="{CubicIn}"
ExpandAnimationLength="500"
CollapseAnimationEasing="{CubicOut}"
CollapseAnimationLength="500">
<Expander.Header>
<Label Text="{Binding Name}"
FontAttributes="Bold"
FontSize="Medium" />
</Expander.Header>
<Expander.ContentTemplate>
<DataTemplate>
<Grid Padding="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="120"
WidthRequest="120" />
<Label Grid.Column="1"
Text="{Binding Details}"
FontAttributes="Italic" />
</Grid>
</DataTemplate>
</Expander.ContentTemplate>
</Expander>
In questo esempio, la CubicIn
funzione di interpolazione accelera lentamente l'animazione di espansione oltre 500ms e la CubicOut
funzione di interpolazione rallenta rapidamente l'animazione di compressione oltre 500ms.
Per altre informazioni sulle funzioni di interpolazione, vedere Funzioni di interpolazione di Xamarin.Forms.
Ridimensionare un espansore in fase di esecuzione
Un Expander
oggetto può essere ridimensionato a livello di codice in fase di esecuzione con il ForceUpdateSize
metodo .
Dato un Expander
oggetto denominato expander
, il cui contenuto include un Label
TapGestureRecognizer
oggetto collegato, nell'esempio di codice seguente viene illustrata la chiamata al ForceUpdateSize
metodo:
void OnLabelTapped(object sender, EventArgs e)
{
Label label = sender as Label;
Expander expander = label.Parent.Parent.Parent as Expander;
if (label.FontSize == Device.GetNamedSize(NamedSize.Default, label))
{
label.FontSize = Device.GetNamedSize(NamedSize.Large, label);
}
else
{
label.FontSize = Device.GetNamedSize(NamedSize.Default, label);
}
expander.ForceUpdateSize();
}
In questo esempio, l'oggetto FontSize
di una Label
modifica quando viene Label
toccato. A causa della modifica delle dimensioni del tipo di carattere, è necessario aggiornare le dimensioni dell'oggetto Expander
chiamando il ForceUpdateSize
relativo metodo.
Disabilitare un espansore
Un'applicazione può immettere uno stato in cui l'espansione di un oggetto Expander
non è un'operazione valida. In questi casi, l'oggetto Expander
può essere disabilitato impostandone la IsEnabled
proprietà su false. Ciò impedisce agli utenti di espandere o comprimere l'oggetto Expander
.