2017-08-08 2 views
0

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

Here's the Error I get...

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>) }; 
+0

UWP hat auch [DataTemplateSelector] (https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.datatemplateselector). – Scavenger

+0

@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. –

+0

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

Antwort

0

Versuchen Sie, Ihre Vorlagen nicht als XAML-Dateien zu erstellen. Kopieren Sie einfach den Template-Inhalt in eine XAML-DataTemplate in einer neuen Resources.Xaml.

Erstellen Sie dann Ihre TemplateSelector wie folgt aus:

public class MyTemplateSelector : DataTemplateSelector { 
      public DataTemplate GreetingTemplate; 
      static ResourceDictionary dataTemplates; 

      public MyTemplateSelector() { 
       if (dataTemplates == null) { 
        dataTemplates = new Templates.DataTemplates(); 
       } 

       GreetingTemplate = dataTemplates["GreetingTemplate"] as DataTemplate; // Look how to load Your Templates! 
      } 

Und senden Sie Ihre Vorlagen wie folgt aus:

protected override Datatemplate SelectTemplateCore (Objektposition, DependencyObject Container) {var Template = item.GetType() ;

 switch (TemplateType.Name) { 
      case "GreetingViewModel": 
       return GreetingTemplate; 

      default: 
       return base.SelectTemplateCore(GreetingTemplate); 
     } 
    } 

Die Klasse Templates.DataTemplates() aus dem ersten Codebeispiel sieht wie folgt aus:

public partial class DataTemplates : ResourceDictionary { 
     public DataTemplates() { 
      InitializeComponent(); 
     } 
    } 

und es ist XAML Ihre Datatemplates enthält.

Hoffe, das hilft.

Verwandte Themen