2016-09-21 17 views
2

Ich versuche eine Art kollabierbarer StackLayout zu implementieren. Mit jedem Klick auf den Button wird das Stacklayout erweitert oder reduziert, um weitere Details anzuzeigen/auszublenden.Xamarin Forms Collapsable StackLayout

enter image description here

konnte ich mehr/weniger dies mit dem folgenden Code erreichen, aber es sieht nicht richtig aus, und die Wirkung ist nicht groß, weil es sofort wächst und ich bin Anwendung die Wirkung anderes Element.

Haben Sie irgendwelche Vorschläge, dies zu tun, verwende ich Xamarin Forms?

XAML

<?xml version="1.0" encoding="utf-8" ?> 
<StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="Sample.MyStackLayout" > 

    <StackLayout x:Name="TopLayout"> 
    <StackLayout Orientation="Horizontal"> 
     <Label Text="some text" VerticalOptions="Center" HorizontalOptions="StartAndExpand" /> 
     <Label Text="123" VerticalOptions="Center" HorizontalOptions="End" FontSize="Large" /> 
    </StackLayout> 

    <BoxView Color="Black" HeightRequest="1" /> 

    <StackLayout Orientation="Horizontal"> 
     <Label Text="some text" VerticalOptions="Center" HorizontalOptions="StartAndExpand" /> 
     <Label Text="123" VerticalOptions="Center" HorizontalOptions="End" FontSize="Large" /> 
    </StackLayout> 

    <StackLayout Orientation="Horizontal"> 
     <Label Text="some text" VerticalOptions="Center" HorizontalOptions="StartAndExpand" /> 
     <Label Text="123" VerticalOptions="Center" HorizontalOptions="End" FontSize="Large" /> 
    </StackLayout> 

    <Button x:Name="btn" Text="Button" Clicked="btnClicked" /> 
    </StackLayout> 


    <StackLayout x:Name="MoreDetails" IsVisible="False"> 
    <Label Text="some text 1"></Label> 
    <Label Text="some text 2"></Label> 
    <Label Text="some text 3"></Label> 
    <Label Text="some text 4"></Label> 
    <Label Text="some text 5"></Label> 
    <Label Text="some text 6"></Label> 
    <Label Text="some text 7"></Label> 
    <Label Text="some text 8"></Label> 
    </StackLayout> 
</StackLayout> 

-Code

public AccountInfo() 
{ 
    InitializeComponent(); 
} 

bool isExpanded = false; 
protected async void btnClicked(object sender, EventArgs e) 
{ 
    if (isExpanded) 
    { 
     await MoreDetails.FadeTo(0); 
     MoreDetails.IsVisible = !isExpanded; 
    } 
    else 
    { 
     MoreDetails.IsVisible = !isExpanded; 
     await MoreDetails.FadeTo(1); 
    } 

    isExpanded = !isExpanded; 
} 

Antwort

0

Wickeln Sie alles, aber MoreDetails zu einem anderen Stapel-Layout mit dem Namen "TopLayout"

void ShowMore(){ 
    TopLayout.TranslateTo(0, -TopLayout.Bounds.Height, 300, Easing.Linear); 
    MoreDetails.LayoutTo(new Rectangle(0, 0, MoreDetails.Bounds.Width, MoreDetails.Bounds.Height + TopLayout.Bounds.Height), 300, Easing.Linear); 
    } 

    void ShowLess(){ 
    TopLayout.TranslateTo(0, 0, 300, Easing.Linear); 
    MoreDetails.LayoutTo(new Rectangle(0, MoreDetails.Bounds.Height, MoreDetails.Bounds.Width, MoreDetails.Bounds.Height - MoreDetails.Bounds.Height), 300, Easing.Linear); 
    } 

100 - hier ist dein displ acement Wert

Als Bonus:

MoreLessImage.RotateXTo(180, Duration, TargetEasing); 

Sie Ihre Taste wie diese morphen Showmore/ShowLess Bild

+0

Sorry, ich könnte etwas falsch zu machen, aber ich klebte Code durch Hinzufügen Dinge wie Animationen erweitern und hat nicht funktioniert wie erwartet. Mein ideia ist entfernen (verstecken) das untere stacklayout. Btw Easing.None existiert nicht in meiner Version von Xamarin Formen, also verwende ich Linear. Ich habe auch alle Hauptinhalte in ein StackLayout eingepackt, also habe ich [StackLayout> StackLayout TopLayout UND StackLayout ModerDetails] – user1845593

+0

Ich habe meine Antwort bearbeitet, probiere diese – Greensy

+0

Danke für die Hilfe, aber kompiliert nicht, TranslateTo nimmt diese params: double x, doppelte y, Uint Länge = 250, Lockerung Easing = null. Übrigens fehlt Ihnen "()" nach ShowMore und ShowLess – user1845593

2

Sie können erstellen eine benutzerdefinierte Steuerelement, das tut dies für Sie zu animieren.

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MyProject.CustomControls.ExpandableView"> 
    <StackLayout x:Name="Layout" Orientation="Vertical" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"> 
     <StackLayout x:Name="SummaryRegion">    
     <StackLayout x:Name="DetailsRegion"/> 
    </StackLayout> 
</ContentView> 

und verdrahten die CS- Klasse wie folgt::

public partial class ExpandableView: ContentView 
    { 

     private TapGestureRecognizer _tapRecogniser; 
     private StackLayout _summary; 
     private StackLayout _details; 

     public ExpandableView() 
     { 
      InitializeComponent(); 
      InitializeGuestureRecognizer(); 
      SubscribeToGuestureHandler();  
     } 

     private void InitializeGuestureRecognizer() 
     { 
      _tapRecogniser= new TapGestureRecognizer(); 
      SummaryRegion.GestureRecognizers.Add(_tapRecogniser); 
     } 

     private void SubscribeToGuestureHandler() 
     { 
      _tapRecogniser.Tapped += TapRecogniser_Tapped; 
     } 

     public virtual StackLayout Summary 
     { 
      get { return _summary; } 
      set 
      { 
       _summary = value;  
       SummaryRegion.Children.Add(_summary); 
       OnPropertyChanged(); 
      } 
     } 

     public virtual StackLayout Details 
     { 
      get { return _details; } 
      set 
      { 
       _details = value; 
       DetailsRegion.Children.Add(_details); 
       OnPropertyChanged(); 
      } 
     } 

     private void TapRecogniser_Tapped(object sender, EventArgs e) 
    { 
     if (DetailsRegion.IsVisible) 
     { 
      DetailsRegion.IsVisible = false; 
     } 
     else 
     { 
      DetailsRegion.IsVisible = true; 
     } 
    } 

und definieren Sie es in Ihrem XAML wie so:

     <CustomControls:ExpandableView> 
          <CustomControls:ExpandableView.Summary> 
            <StackLayout> 
            YOUR STUFF HERE 
           </StackLayout> 
          </CustomControls:ExpandableView.Summary> 
          <CustomControls:ExpandableView.Details> 
           <StackLayout> 
            YOUR STUFF HERE 
           </StackLayout> 
          </CustomControls:ExpandableView.Details> 
         </CustomControls:ExpandableView> 
Falls Sie ein 'ExpandableView' Seiten mit XAML wie erstellen

Dabei ist CustomControls der Verweis auf den Namespace, in dem ExpandableView vorhanden ist.

Sie diese weiter auszubauen, markieren Sie die ‚Zusammenfassung Region‘, wenn erweitert etc ...

+0

Würde es Ihnen etwas ausmachen, mir ein bisschen mehr Details zu schreiben, wie sollte ich Ihren Code implementieren? Der erste XAML sollte in einer Datei korrekt sein? Und der C# -Code sollte in der CS-Datei dieser XAML-Ansicht sein? Also, wo sollte der zweite XAML-Code von Ihnen präsentiert werden? – Eru

+0

Ja, also haben Sie eine XAML-Datei, die so etwas wie ExpandableView.xaml heißen wird, die das erste Snippet enthält, jetzt ist diese XAML-Datei KEINE ContentPage, sondern eine "ContentView". Als nächstes haben Sie die ExpandableView.xaml.cs das zweite Snippet enthalten. Dann haben Sie in Ihrer aktuellen Seite den Code aus dem dritten Snippet. Sie müssen sicherstellen, dass Ihre Seite die benutzerdefinierte Steuerdatei sehen kann. – DParry