2016-05-12 5 views
3

Ich habe eine Inhaltsansicht in Xamarin Formen mit 2 StackLayout horizontal ausgerichtet. Ich möchte den Inhalt des 2. Stacklayouts dynamisch ändern, aber ich möchte in diesem Fall nicht die Master-Details-Seite verwenden. Finden Sie einen Anhang, um zu sehen, wie meine Benutzeroberfläche aussieht. Ich möchte verschiedene Seiten in StackLayout 2 auf Knopfklicks in StackLayout 1 laden.Laden Sie ein Xaml in ein Stacklayout in Xamarin Formen

Update: Ich möchte oben mit MVVM erreichen.

enter image description here

Antwort

0

Cant Sie etwas tun, wie folgt aus:

button1.OnClick += (sender, args) =>{ 
    StackLayout2.Children.Remove(currentview); 
    StackLayout2.Children.Add(newview); 
} 

nicht sicher, ob seine Onclick oder angeklickt genannt.

2

Sie haben ausdrücklich gesagt, dass Sie verschiedene Seiten in Stacklayout2 laden möchten. Out of the Box ist dies nicht möglich. Eine Seite kann nicht in einer anderen Ansicht in Xamarin verschachtelt werden. *

Sie wahrscheinlich brauchen nicht, um eine ganze Seite entweder zu nisten, was gute Nachrichten sind.

Sie können benutzerdefinierte XAML-Ansichten als separate XAML-Dateien erstellen und dann wie normale Steuerelemente darauf verweisen. Zum Beispiel würden Sie eine XAML-Datei MyDataView erstellen, in der Sie ein und füllen Sie es mit Ihren verschiedenen Etiketten, Einträge und was nicht, dann instanziieren und fügen Sie das MyDataView in Ihrer Seite wie jedes andere Steuerelement.

Für Ihre Host-Seite würde ich Ihnen empfehlen, Ihr StackLayout2 in ein ContentView zu ändern, da es immer nur eine Ansicht enthält, die im Falle von etwas wie Ihrem benutzerdefinierten "MyDataView" von oben das Stack-Layout enthält alle Details.

Aus der Sicht Ihrer Seite hat es das linke Layout mit allen Tasten, und es hat den "Container" auf der rechten Seite, um verschiedene komplexe Ansichten zu hosten. Es benötigt also kein Stacklayout.

Es gibt auch eine wichtige Entscheidung, die Sie treffen müssen, wenn und wie Sie alle Ansichten im rechten Fensterbereich instanziieren möchten.

Sie können sie alle gleichzeitig instanziieren, wenn die Seite geladen wird, wenn es nicht zu viele gibt. Dann sollte der Wechsel zu jedem einzelnen während der Seitenbenutzung ziemlich schnell sein. Etwas wie folgt aus:

public partial class MainPage 
    { 
     private MyDataView myDataView = new myDataView(); 
     private OtherView otherView = new OtherView(); 
     private ThirdView thirdView = new ThirdView(); 


     public void OnSomeButtonClick(object sender, EventArgs e) 
     { 
      Container.View = myDataView; //Container would be the x:Name you gave to your ContentView control on the right side of the page that will host the different views 
     } 
    } 

Oder Sie könnten die Ansichten zu „faul“ instanziiert bevorzugen, die nur die Ansicht zum ersten Mal instanziiert würde es navigiert wird. Dies ist nützlich, wenn auf einige Ansichten nie wirklich zugegriffen wird, und Sie können einige CPU-Zyklen und RAM speichern, indem Sie die Ansicht nicht laden, bis sie benötigt wird. Der Nachteil ist natürlich, wenn Sie es zum ersten Mal laden, wird es langsamer laden. Wie folgt:

public partial class MainPage 
    { 
     private MyDataView myDataView; 
     private OtherView otherView; 
     private ThirdView thirdView; 


     public void OnSomeButtonClick(object sender, EventArgs e) 
     { 
      if (myDataView == null) myDataView = new MyDataView(); 
      Container.View = myDataView; //Container would be the x:Name you gave to your ContentView control on the right side of the page that will host the different views 
     } 
    } 

Und schließlich können Sie die Ansicht jedes Mal instanziieren, wenn es benötigt wird. Ich würde in den meisten Fällen nicht mit dieser Route gehen. Es sei denn, Sie wirklich speziell jedes Mal die gesamte Ansicht neu erstellen müssen (wie wenn Sie dynamisch es während des Gebrauchs zu ändern sind, und Sie müssen es neu einstellen, wenn es wieder gezeigt hat)


* Ich habe eine benutzerdefinierte Renderer Implementierung gesehen, dass verschachtelte eine ganze Seite in einer Ansicht auf GitHub.Ich habe es nicht getestet, da es zu diesem Zeitpunkt nicht vollständig implementiert war.

+0

Danke @irreal, aber wie diese Bindung in Xaml-Datei und in meiner Modellansicht zu deklarieren – user3087365

+0

Dies verwendet keine Bindung, um die entsprechende Ansicht anzuzeigen, es weist die Ansicht nur dem Container in Code hinter. In der Detailansicht können Sie die Bindung wie gewohnt normal verwenden. Fügen Sie bei der Erstellung von MyDataView() einfach den Bindungskontext wie {BindingContext = YourViewModel} hinzu. Wenn Sie eine Bindung zum Ein-/Ausblenden dieser Ansichten verwenden möchten, ist das ein ganz anderes Thema. Erstellen Sie eine neue Frage (nach dem Durchsuchen vorhandener Fragen desselben Typs) und fragen Sie speziell nach Bindings zum Anzeigen von Steuerelementen. – irreal

+0

Dank @irreal wird versuchen, mit Binding Context zu erreichen – user3087365