2016-04-14 8 views
0

Wie in Windows Forms können wir mehrere Panels im selben Formular hinzufügen und basierend auf bestimmten Bedingungen bestimmte Panel ein- und ausblenden. Gibt es eine Kontrolle in , die so verwendet werden kann?Wie implementieren Sie Panel-Funktion in Xamarin.forms

Der Hauptgrund dafür ist, ich habe 3 Tabs auf einer Seite. Ich verwende Knöpfe für Tabulatoren und nicht für Tabulatoren, da das Design der Tableiste nicht das ist, was mein Klient will. So habe ich 3 Seiten sagen Page A, Page B, Page C und jede Seite hat 3 Registerkarten, um auf die entsprechende Seite zu gehen. Wenn Benutzer auf Page A ist und irgendeine Art von Daten (die noch nicht gespeichert werden) füllt und zu Page B und dann auf Page B gehen möchte, fügt er einige weitere Details hinzu und dann ohne Daten zu Page B zu speichern, wenn er zu Page A alle Details zurückkommt gefüllt von Benutzer auf Page A und Page B muss verfügbar sein.

Daher Wenn ich mehrere Seiten für diese verwenden, dann werden die Daten verloren gehen, wenn ich auf neue Seite umleiten. Also gibt es eine Möglichkeit, mit der ich mehrere Panels habe und das erste Panel ausblenden, wenn das zweite Panel sichtbar ist, das keine Daten löscht und somit kann ich erreichen, was ich will.

Antwort

1

Sie können nur die Panels ausblenden, die nicht verwendet werden (mit der Eigenschaft IsVisible) - dies zieht sie aus dem visuellen Baum, aber nicht aus dem Speicher freigegeben.

Wenn Sie für jede Seite eine Inhaltsansicht erstellen, können Sie sie einfach in Ihrer Hauptbenutzeroberfläche verwenden, wie in diesem Beispiel. Auch wenn wir die einzelnen Platten versteckt werden sie noch in Erinnerung bleiben, während versteckt:

MyView.cs (dies alles sein, könnten Sie in Ihren Panels wollen):

using System; 
using Xamarin.Forms; 

namespace FormsSandbox 
{ 
    public class MyView : ContentView 
    { 
     public static BindableProperty TextProperty = BindableProperty.Create("Text", typeof(string), typeof(MyView), 
      String.Empty, BindingMode.Default, null, TextChanged); 

     public string Text { 
      get { 
       return (string)GetValue (TextProperty); 
      } 
      set { 
       SetValue (TextProperty, value); 
      } 
     } 

     private Label _contentLabel; 

     public MyView() 
     { 
      _contentLabel = new Label { 
       FontSize = 56, 
       FontAttributes = FontAttributes.Bold, 
       HorizontalTextAlignment = TextAlignment.Center, 
       VerticalTextAlignment = TextAlignment.Center 
      }; 
      Content = _contentLabel; 
     } 

     static void TextChanged (BindableObject bindable, object oldValue, object newValue) 
     { 
      var view = (MyView)bindable; 
      view._contentLabel.Text = (newValue ?? "").ToString(); 
     } 
    } 
} 

XamlPage.xaml (Haupt-UI-Seite):

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:sandbox="clr-namespace:FormsSandbox" 
    x:Class="FormsSandbox.XamlPage"> 
    <ContentPage.Padding> 
     <OnPlatform x:TypeArguments="Thickness" iOS="0,20,0,0" Android="0" WinPhone="0"/> 
    </ContentPage.Padding> 

    <Grid RowSpacing="0" ColumnSpacing="0"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 

     <Button Text="1" Clicked="ButtonClicked" x:Name="Button1" Grid.Column="0" /> 
     <Button Text="2" Clicked="ButtonClicked" x:Name="Button2" Grid.Column="1" /> 
     <Button Text="3" Clicked="ButtonClicked" x:Name="Button3" Grid.Column="2" /> 

     <sandbox:MyView Text="1" x:Name="View1" Grid.Row="1" Grid.ColumnSpan="3" /> 
     <sandbox:MyView Text="2" x:Name="View2" Grid.Row="1" Grid.ColumnSpan="3" /> 
     <sandbox:MyView Text="3" x:Name="View3" Grid.Row="1" Grid.ColumnSpan="3" /> 
    </Grid> 

</ContentPage> 

XamlPage.xaml.cs:

using System; 
using Xamarin.Forms; 

namespace FormsSandbox 
{ 
    public partial class XamlPage : ContentPage 
    { 
     public XamlPage() 
     { 
      InitializeComponent(); 
      SelectButton (Button1); 
     } 

     void SelectButton(Button button) 
     { 
      View view = null; 
      if (button == Button1) 
       view = View1; 
      if (button == Button2) 
       view = View2; 
      if (button == Button3) 
       view = View3; 
      View1.IsVisible = View1 == view; 
      View2.IsVisible = View2 == view; 
      View3.IsVisible = View3 == view; 
      Button1.TextColor = (Button1 == button) ? Color.Accent.AddLuminosity(0.18) : (Color)Button.TextColorProperty.DefaultValue; 
      Button2.TextColor = (Button2 == button) ? Color.Accent.AddLuminosity(0.18) : (Color)Button.TextColorProperty.DefaultValue; 
      Button3.TextColor = (Button3 == button) ? Color.Accent.AddLuminosity(0.18) : (Color)Button.TextColorProperty.DefaultValue; 
      Button1.BackgroundColor = (Button1 == button) ? Color.Silver.AddLuminosity(0.18) : Color.Silver.AddLuminosity(0.1); 
      Button2.BackgroundColor = (Button2 == button) ? Color.Silver.AddLuminosity(0.18) : Color.Silver.AddLuminosity(0.1); 
      Button3.BackgroundColor = (Button3 == button) ? Color.Silver.AddLuminosity(0.18) : Color.Silver.AddLuminosity(0.1); 
     } 

     void ButtonClicked (object sender, EventArgs e) 
     { 
      SelectButton ((Button)sender); 
     } 
    } 
} 

Running example

+0

danke, es hat funktioniert. – Arti

+0

Könnten Sie bitte einen Blick auf [Frage] (http://stackoverflow.com/questions/36641270/access-controls-from-view-in-content-page) werfen. Ich bin nicht in der Lage, auf contentview Eingabefeld in meinem contentPage – Arti

+0

Ich habe einen Blick auf diese Frage auch und fügte eine Antwort, die helfen sollte. Bitte markieren Sie als Antwort, wenn es für Sie funktioniert, damit andere keine Zeit damit verbringen, ein Problem zu lösen, an dem Sie nicht mehr hängen bleiben :). –

1

Sie können diese Daten in einem Cache speichern und von dort laden.

public static class MyDataCache 
{ 
    public static MyData MyData { get; } = new MyData(); 
} 

// in your pages 
protected override void OnAppearing() 
{    
    base.OnAppearing(); 
    // set data from MyDataCache.MyData 
    MyProperty = MyDataCache.MyData.MyProperty; 
} 

protected override void OnDisappearing() 
{    
    base.OnDisappearing(); 
    // set data to MyDataCache.MyData 
    MyDataCache.MyData.MyProperty = MyProperty; 
} 

Aber Vorsicht: Es ist nur ein Speichercache. Wenn die App veraltet wird, gehen die Daten verloren. Sie können diesen Ansatz zuerst ausprobieren und sehen, ob er Ihrem Bedarf entspricht. Danach sollten Sie die Daten in einem temporären Speicher (z. B. mit Akavache) speichern. Sie sollten dieses Seitennavigationsverhalten nicht mit etwas benutzerdefiniertem wiederherstellen.

+0

Durch Speichern im Cache bleiben die Werte beim Seitenwechsel erhalten? – Arti

+0

Ja. es ist eine statische Klasse. Es ist im Speicher, solange die App im Speicher ist. Sie müssen nur Ihre Eigenschaften füllen, wenn die Seite erscheint. –

+0

Nur zur Bestätigung, Beim Laden der Seite sagen 'Seite A' Ich lese Daten aus der XML-Datei serialisieren und in Textboxen und anderen Steuerelementen anzeigen, wenn Benutzer auf' Seite B' geht, wird er aufDisappearing aufrufen und speichern Sie die Daten in statische Variable. Wenn ich dann von "Page B" nach "Page A" zurückkehre, muss ich wieder meine Steuerelemente mit gespeicherten Daten aus statischen Variablen füllen. – Arti

Verwandte Themen