Ich habe eine Xamarin.Forms UWP App erstellt und es fühlte sich an wie ein Eimer voller Zement an deinen Füßen während du versuchst das Mittelmeer durch Schwimmen zu überqueren. Also wechselte ich auf native UWP-Programmierung.TemplateSelector für UWPs FlipView
Meine Anwendung wird zu 95% dynamisch erstellt. Alle Seitensteuerelemente auf den Seiten sind abhängig davon, was in der Datenbank gespeichert ist.
Ich habe eine Login-Seite, eine Karussell-Seite (FlipView) und eine QuitPage.
Alle anderen Seiten werden dynamisch geladen und der FlipView-ItemsSource hinzugefügt.
In Xamarin hatte ich eine TemplateSelector wie die in diesem Link: https://github.com/alexrainman/CarouselView/blob/master/Demo/Views/MyTemplateSelector.cs
Meine Frage ist: Wie kann ich dynamisch DateTemplates aus meinen Ansichten/Pages erstellen?
BTW: Ich wechselte von Xamarin zu nativen, weil es schwere Leistungsprobleme gab. Das Karussell schaltet jedesmal auf das erste Element um und benötigte einige Sekunden, um die "aktuelle" Seite erneut anzuzeigen, nachdem die Größe geändert wurde (über die virtuelle Tastatur).
Ich hoffe auf eine Lösung ohne solche Leistungsprobleme, wenn mehr als 30 Elemente in der Liste sind.
Vielleicht kann jemand erklären, warum es ein solches Leistungsproblem gibt? Ich kann nicht glauben, dass jede Seite neu geladen wird, verursacht durch die Größe, die durch das virtuelle kb geändert wird.
Vielen Dank im Voraus.
EDIT:
Nachdem ich den Button für die Bearbeitung gefunden, hier ist was ich so weit gekommen:
Ich habe eine Seite mit dem Namen CarouselView. Im Xaml habe ich die FlipView namens "myCarousel".
Im Codebehind ich den folgenden Code haben:
public partial class WellcomeView : BasePage {
#region Fields + Properties
private int _position;
public int Position { get { return _position; } set { _position = value; } }
#endregion
public CarouselView() {
InitializeComponent();
myCarousel.ItemTemplateSelector = new MyTemplateSelector();
DataContext = new WellcomeViewModel(null, null, null, null, null);
}
public class MyTemplateSelector : Windows.UI.Xaml.Controls.DataTemplateSelector {
private DataTemplate GreetingTemplate;
...
public MyTemplateSelector() {
this.GreetingTemplate = (DataTemplate)Windows.UI.Xaml.Markup.XamlReader.Load(new GreetingView().Content.ToString());
...
// Here it throws an error. No matter if MainPage (with content) or other Views (with Content==null). But in every case I get a XamlParseException.
} // End Ctor
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) {
var TemplateType = item.GetType();
switch (TemplateType.Name) {
case "GreetingViewModel":
return base.SelectTemplateCore(GreetingTemplate);
default:
return base.SelectTemplateCore(BegruessungTemplate);
} // End switch-case
} // End SelectTemplateCore()
} // End MyTemplateSelector()
} // End Klasse WellcomeView
Und hier ist der Stacktrace:
at Windows.UI.Xaml.Markup.XamlReader.Load(String xaml)
at MEDePORT_Win_Native.Views.WellcomeView.MyTemplateSelector..ctor()
at MEDePORT_Win_Native.Views.WellcomeView..ctor()
at MEDePORT_Win_Native.MEDePORT_Win_Native_XamlTypeInfo.XamlTypeInfoProvider.Activate_11_WellcomeView()
at MEDePORT_Win_Native.MEDePORT_Win_Native_XamlTypeInfo.XamlUserType.ActivateInstance()
at Windows.UI.Xaml.Controls.Frame.Navigate(Type sourcePageType, Object parameter)
at MEDePORT_Win_Native.App.OnLaunched(LaunchActivatedEventArgs e)
EDIT: Mit "new MyView(). Content.ToS tring() "Ich bekomme nur den Namen des Typs. Zum Beispiel "Windows.Ui.Xaml.Controls.Grid".
So scheint es wie ich Xaml aus einer Ansicht extrahieren und es in eine Zeichenfolge konvertieren muss.
EDIT EDIT EDIT EDIT EDIT:
Was ist die UWP Äquivalent für den folgenden Code?
DataTemplate template = new DataTemplate { DataType = typeof(< Type of the object the template refers>) };
UWP hat auch [DataTemplateSelector] (https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.datatemplateselector). – Scavenger
@Scavenger Ja, das stimmt, aber ich habe keine funktionierende Lösung für mich gefunden. Ich habe so etwas im Internet gesehen: private DataTemplate FilmTemplate; öffentlich MyTemplateSelector() { this.FilmTemplate = (DataTemplate) XamlReader.Load (neues FilmView(). Content.ToString()); } Aber ich bekomme NullReferences für jede Seite/ContentView mit Ausnahme der MainPage. Es scheint, dass der "Inhalt" vom Xaml nicht geladen wurde, aber ich verstehe nicht warum. Wenn ich meine Opening Post bearbeiten kann, füge ich meine aktuelle "Lösung" zum besseren Verständnis hinzu. Vielen Dank. –
Sie sollten in der Lage sein, Ihre eigene Frage zu bearbeiten. Bitte fügen Sie den Code in Ihre Frage ein und ein [mcve] könnte hilfreicher sein. – Scavenger