wake-up-neo.com

Verwendung von Xamarin.Form-Steuerelementen und systemeigenen Steuerelementen auf derselben Seite

Ich möchte Xamarin.Form Control in meinen Native Android Page Controls verwenden. Gibt es eine Möglichkeit, eine Xamarin.Form-Seite in meine native Android-Fragment- oder LinearLayout-Seite zu laden?

Nach Xamarin ist es möglich. Aber ich kann nicht finden, wie ich das erreichen kann.

http://xamarin.com/forms

13
Gulshan

Es werden ein paar Dinge besprochen, nehmen Sie Kontakt mit mir auf:

Der Bildausschnitt, soweit ich weiß:

 "Not only are Xamarin.Forms pages mixable with custom screens" ...

Dies ist, wie @Stephane erwähnt, dass eine Anwendung native Bildschirme verwenden kann auch als Xamarin.Forms Bildschirme. Jede Plattform Stub-Seite kann zu jedem Zeitpunkt in der Anwendung eine gemeinsame Xamarin.Forms Seite einfügen. Sie müssen nicht Xamarin.FormsNavigationsstapel verwenden.

 "but you can embed custom views built directly against Xamarin.IOS and Xamarin.Android into Xamarin.Forms pages."

Dies ist, was @Sten erwähnt, wo, wenn Sie erstellen plattformspezifischContentRenderer Sie können jede Art von native Steuerelementein eine vorhandeneXamarin.Forms Seite einfügen, indem Sie diese gemeinsame View an jeden Plattform-Renderer übergeben.

Wenn Sie also zum Beispiel ein View hatten: -

 public class MyView : ContentView
 {
     // Create some bindable properties here that can be used in your platform specific renderer,
     // i.e. DisplayText etc.
 }

Sie können das Obige in einer Xamarin.Forms Seitendefinition verwenden und dann plattformspezifische Renderer erstellen, die aufgerufen werden, um den Inhalt zu rendern =.

Aus diesen plattformspezifischen Content-Renderer-Klassen heraus können Sie native Steuerelemente auf jeder Plattform verwenden.

Zum Beispiel könnten Sie im ContentRenderer für das Ereignis OnElementChanged für WindowsPhone Folgendes tun: -

 protected override void OnElementChanged(Xamarin.Forms.Platform.WinPhone.ElementChangedEventArgs<MyView> e)
 {
     base.onElementChanged(e);
     ...
     System.Windows.Controls.TextBox objPlatformSpecificTextBox = new System.Windows.Controls.TextBox();
     ... 
     ...

Was @ Gulshan jedoch wirklich möchte, ist meiner Meinung nach eine native Seite das heißt im Mittelpunkt, wobei der Xamarin.Forms Inhalt gerendert wird in einen bestimmten Punkt in einer bereits vorhandenen nativen Seite.

Es ist ein bisschen umgekehrt, wenn man denkt, aber das ist immer noch möglich:

Um dies zu erreichen, müssen Sie die Seitengenerierung zu einer temporären neuen Seite anregen.

Zum Beispiel in WindowsPhone würden Sie dies tun über: -

        PhoneApplicationPage objInnerPage_Temp = new PhoneApplicationPage();
        UIElement objInnerContent = App.GetMainPage().ConvertPageToUIElement(objInnerPage_Temp);

auf der plattformspezifischen stub-Seite.

Sie können dann Einfügen den gerenderten Inhalt in einen nativen Container, der auf der Plattform geeignet ist, d. H. Ein Raster.

pdate 1: -

==========

Obwohl es sehr einfach ist, dies auf WindowsPhone zu tun, scheint dies leider nicht möglich zu sein, wenn man etwas Ähnliches in Android versucht.

Die Android Seitenerstellung ist sehr gesperrt, dh Sie können erhalten Zugriff auf die privaten Felder für Canvas und/oder Layout dass es intern in AndroidActivity verwendet.

Wenn dies möglich wäre, könnten Sie diese wiederverwenden und den gerenderten Inhalt übernehmen und injizieren ähnlich der Lösung für die WindowsPhone -Plattform.

Darüber hinaus ist die Platform -Klasse als internal gekennzeichnet, wodurch eine andere Möglichkeit zum Generieren des gerenderten Inhalts verhindert wird.

Es bestand die Hoffnung, dass ich mich dem von einer Fragment -Implementierung näherte, in der eine Aktivität generiert wurde, und dies könnte gut funktionieren - jedoch - Das Problem hierbei ist, dass die Implementierung in Xamarin.Forms erwartet, dass ActionBar verfügbar ist, was nicht der Fall ist, und dass nicht nach einem gesucht wird. -if null Szenario, in dem die Ausführung fortgesetzt werden soll, wenn es nicht verfügbar ist, sodass eine Ausnahme ausgelöst wird, die die Generierung von Seiteninhalten verhindert.

Es sieht also nicht möglich aus ?, es sei denn, sie öffnen die Layout-/Canvas-Felder in AndroidActivity oder lösen das Erwartungsproblem ActionBar.

10
Pete

Wie bereits erwähnt, ist es relativ einfach auf iOS (mit .CreateViewController ()) undWP(.ConvertPageToUIElement ()). 

Aber auf Android ist auch nicht alles verloren: Sie können .GetView () - Erweiterung -Methode aus http://www.arturdr.ru/Android/xamarin-forms-i verwenden -slozhnosti-integratsii-v-Android-prilozheniya/

Hier ein Beispiel, wie die Xamarin.Forms-Seite in Android AlertDialog mit dieser Methode umbrochen wird: https://github.com/OlexaLe/XFPageAsAndroidDialog

2
olexa.le

Sie suchen wahrscheinlich nach einem benutzerdefinierten Renderer.

  • Erstellen Sie in Ihrem Forms-Projekt eine Klasse MyView, die von View erbt (oder einer anderen geeigneten Klasse, sagen Sie ContentView, wenn Sie über untergeordnete Ansichten verfügen usw.).
  • Erstellen Sie in Ihrem Android-Projekt eine Renderer-Klasse MyViewRenderer, die ViewRenderer erbt.
  • Fügen Sie der Klasse das Attribut hinzu, das angibt, dass es sich um einen Renderer handelt vor der Namespacedeklaration [Assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))]
  • Rufen Sie in MyViewRenderer OnElementChanged auf, und rufen Sie base.SetNativeView(ctl) auf, wobei ctl eine Instanz Ihres systemeigenen Steuerelements ist

Werfen Sie einen Blick auf Xamarins Führer

Eine weitere Ressource in Xamarins Foren .

Nachdem ich mir das Problem angesehen und meinen eigenen Border implementiert habe, würde ich sagen, dass VisualElementRenderer<TElement> ein besserer Renderer ist. Wenn Sie dies verwenden, müssen Sie lediglich OnElementChanged überschreiben und NativeView.Add(customUIView) ausführen und Eigenschaften aus der MyView-Instanz kopieren. Um dynamische Änderungen in diesen Eigenschaften zu verarbeiten, überschreiben Sie OnElementPropertyChanged und aktualisieren Sie die customUIView-Instanz 

1
Sten Petrov

Xamarin hat seine Website überarbeitet, so dass das Bild oben veraltet ist. Mit der Weiterentwicklung der Xamarin.Forms-Bibliothek scheint es schwieriger geworden, Xamarin.Forms und plattformspezifische native Ansichten zu mischen. Ich würde das nicht empfehlen. 

Fortgeschrittene Benutzer können dies sicherlich versuchen, aber meine Gespräche mit anderen Entwicklern deuten darauf hin, dass dies eine Menge zusätzlicher Arbeit und zusätzlichen Aufwand verursacht. Der beste Weg nach vorne ist, Xamarin.Forms ausschließlich für Ihre Ansichten zu verwenden oder plattformspezifische native Ansichten zu verwenden. 

Hier ist ein Screenshot von Xamarins Xamarin.Forms-Seite (aufgenommen am 13. Mai 2015):

enter image description here

1
Nick Lee

Sie können eine neue Activity erstellen, die von Xamarin.Forms unterstützt wird, indem Sie von Xamarin.Forms.Platform.Android.AndroidActivity erben und diese neue Aktivität von einer anderen in Ihrer Xamarin.Android-Anwendung starten.

0