Come utilizzare Xamarin.Controlli del Form e i Controlli Nativi Sulla stessa pagina

Voglio usare Xamarin.Modulo di Controllo all’interno del mio Nativo di Android per i Controlli della Pagina. Nel mio Android nativo pagina c’è un modo per caricare un Xamarin.Modulo di Pagina all’interno del mio Nativo di Android Frammento o LinearLayout?

Secondo Xamarin è possibile. Ma non riesco a trovare il modo per raggiungere questo obiettivo.

Come utilizzare Xamarin.Controlli del Form e i Controlli Nativi Sulla stessa pagina

  • C’è un modo per incidere questo, nel caso in cui qualcuno deve ancora. Molto più di un hack, che coinvolgono la decompilazione e la copia di alcune classi molto Xamarin.Forme quadro, è stato sviluppato da un mio collega, e descritto in nel suo blog. Il post è, purtroppo, in russo, ma è abbastanza google traducibili, e non c’è bisogno di leggere qualcosa di copiare il codice o scaricare l’esempio (vedi l’ .zip di seguito codice).
  • Un avvertimento è per sempre .Dispose() vista dal hacked inflater – la gestione della memoria è normalmente fatto da Xamarin.Forme di lavoro e non sul suo proprio fuori.
  • È questo ancora non è possibile?
InformationsquelleAutor Gulshan | 2014-09-05

 

5 Replies
  1. 11

    C’è un paio di cose di cui si discute, in modo da portare con me:

    L’immagine frammento, da quello che ho capito:

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

    Questo è come ciò che @Stephane nel senso di permettere un’applicazione per l’utilizzo di schermi nativi e come Xamarin.Forme schermi. Ogni piattaforma stub-pagina può introdurre un comune Xamarin.Forme pagina in qualsiasi punto dell’applicazione. Non è necessario utilizzare il Xamarin.Forme Stack Di Navigazione.

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

    Questo è quello che @Sten è un accenno, dove se si crea specifico della piattaforma ContentRenderers è in grado di rendere qualsiasi tipo di controlli nativi in un esistente Xamarin.Forme pagina, passando questo comune Vista per ogni piattaforma renderer.

    Così, per esempio se si ha un Vista:-

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

    È possibile utilizzare in Xamarin.Forme definizione di pagina e quindi creare piattaforma renderer specifici che sarebbe chiamato a il rendering del contenuto.

    È all’interno di questi piattaforma di contenuti specifici renderer classi che è possibile utilizzare controlli nativi su ogni piattaforma.

    Per esempio, nel ContentRenderer, per l’evento OnElementChanged si potrebbe fare qualcosa di simile per WindowsPhone:-

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

    Tuttavia, ciò che @Gulshan è davvero la voglia, credo, è quello di avere un nativo pagina che è il centro del palco con il Xamarin.Forme contenuto viene reso in un punto specifico in un già esistenti nativo pagina.

    Sua un pò inversione di tendenza, nel modo di pensare, tuttavia questo è ancora possibile:-

    Per ottenere questo è necessario per stimolare la pagina di generazione in temporaneo nuova pagina.

    Per esempio in WindowsPhone volesse farlo attraverso:-

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

    sul specifico della piattaforma stub-pagina.

    È quindi possibile iniettare il rendering di contenuti in un contenitore nativo che è appropriato sulla piattaforma, cioè un Griglia.

    Aggiornamento 1:-

    ==========

    Anche se la sua molto facile fare questo su WindowsPhone non mi sembra che questo è possibile quando si tenta qualcosa di simile in Android purtroppo.

    Il Android pagina di creazione è molto bloccato, cioè non è non accedere al privato campi per tela e/o layout che utilizza internamente in AndroidActivity.

    Se questo fosse possibile, allora si potrebbe ri-utilizzare questo e prendere il contenuto di rendering e iniettare simile alla soluzione per il WindowsPhone piattaforma.

    Inoltre, il Piattaforma classe è contrassegnato come interno anche, impedendo un altro modo per generare il rendering di contenuti.

    C’era la speranza stavo pensando di avvicinarsi a questo da un Frammento attuazione di generare un Attività in esso, e questo potrebbe funzionare bene – Tuttavia – il problema qui è che l’implementazione in Xamarin.Forme è previsto il ActionBar di essere disponibili, di cui non è, e non sono il controllo per un se null scenario per consentire l’esecuzione di continuare, se non è disponibile così si genera un’eccezione prevenire la pagina di generazione di contenuti.

    Non è pertanto possibile?, a meno che non apri il layout /tela campi AndroidActivity o l’indirizzo del ActionBar aspettativa problema.

    • Sì, sono consapevole di custom renderer. Ma utilizzando un motore di rendering, penso di si può ottenere solo utilizzando un nativo di controlli all’interno di un Xamarin.Pagina Del Form. Ma la mia richiesta è totalmente opposto. Voglio usare xamarin.Pagina del form all’interno di alcuni Controlli Nativi. Se si guardano le Attività in cui un Xamarin.Pagina del form è stato utilizzato, C’è un metodo “SetContentPage ()”, Che prende un XamarinForms Pagina come un insieme di input per l’intera attività. Quello che sto cercando è Un modo in cui posso impostare il mio XamarinForm Pagina o di Controllo all’interno di un Layout o Fragement. O se posso convertire Xamarin.Le forme.Vista per Android.Punti di vista.Vista.
    • L’ultima parte della mia risposta non evidenziare quello che ho creduto che la tua intenzione non era e ha suggerito un approccio. La sua possibile tramite WindowsPhone facilmente, tuttavia, Android è molto bloccata. Ho aggiornato la mia risposta per riflettere le nuove scoperte (vedi Update 1). Di dove sei di vedere la SetContentPage() Android non mi sembra essere in grado di trovare questo metodo?
    • Sì, molto vero. In realtà stavo cercando un metodo simile per android come “ConvertPageToUIElement” in Windows Phone. Ho estratto il codice di AndroidActivity. E hai ragione, la Piattaforma di classe è contrassegnato come interni. Così può essere per ora non è possibile.
  2. 2

    Come già detto, è abbastanza semplice iOS (con .CreateViewController()) e WP (.ConvertPageToUIElement()).

    Ma Android non tutto è perduto troppo: è possibile utilizzare .GetView() estensione metodo da http://www.arturdr.ru/android/xamarin-forms-i-slozhnosti-integratsii-v-android-prilozheniya/

    Ecco un esempio su come avvolgere Xamarin.Pagina del form in Android AlertDialog usando questo metodo:
    https://github.com/OlexaLe/XFPageAsAndroidDialog

    • Purtroppo, significative modifiche sarebbero necessarie per aggiornare il codice per il funzionamento con corrente Xamarin Forme. Ho aggiunto un problema di XFPageAsAndroidDialog progetto, che descrive brevemente ciò che è necessario.
  3. 1

    Si sono probabilmente alla ricerca di un costume renderer.

    • Nei Moduli di progetto di creare una classe MyView che eredita da View (o da qualche altro classe, dire ContentView se avrete viste figlio ecc)
    • Nel progetto Android di creare una classe di rendering MyViewRenderer che eredita ViewRenderer
    • Aggiungere l’attributo di classe che indica che si tratta di un renderer prima la dichiarazione dello spazio dei nomi
      [assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))]
    • In MyViewRenderer ignorare OnElementChanged, chiamata base.SetNativeView(ctl) dove ctl è un’istanza del controllo nativo

    Dare un’occhiata a Xamarin guida

    Un’altra risorsa in Xamarin del Forum.

    Dopo aver guardato la questione, e con l’implementazione del proprio Confine direi VisualElementRenderer<TElement> è meglio un renderer per l’uso. Se si utilizza che tutto quello che si dovrà fare è ignorare OnElementChanged e fare NativeView.Add(customUIView) e copia proprietà dal MyView istanza. Per gestire i cambiamenti dinamici in queste proprietà ignorare OnElementPropertyChanged e aggiornare il customUIView istanza

    • Sì, sono consapevole di custom renderer. Ma utilizzando un motore di rendering, penso di si può ottenere solo utilizzando un nativo di controlli all’interno di un Xamarin.Pagina Del Form. Ma la mia richiesta è totalmente opposto. Voglio usare xamarin.Pagina del form all’interno di alcuni Controlli Nativi. Se si guardano le Attività in cui un Xamarin.Pagina del form è stato utilizzato, C’è un metodo “SetContentPage ()”, Che prende un XamarinForms Pagina come un insieme di input per l’intera attività. Quello che sto cercando è Un modo in cui posso impostare il mio XamarinForm Pagina o di Controllo all’interno di un Layout o Fragement. O se posso convertire Xamarin.Le forme.Vista per Android.Punti di vista.Vista.
    • come su una Pagina del Form che contiene il controllo nativo in un custom renderer e un NativeChild personalizzato renderer che può spostare la sua vista come un sottoview nativo? Non credo che è possibile ottenere questo in modo completamente applicazione nativa
    • La sua possibile in WindowsPhone tuttavia, Android è troppo bloccato appare. Non ho testato questo su iOS oggi.
  4. 1

    Xamarin rivisto il suo sito web, l’immagine qui sopra è obsoleto. Come Xamarin.Forme biblioteca si è evoluto, sembra che sia diventato più difficile mix di Xamarin.Forme e specifici della piattaforma nativa di vista. Non mi consiglia di fare questo.

    Gli utenti avanzati possono certamente tentare questo, ma le mie conversazioni con gli altri sviluppatori suggeriscono che questo crea un sacco di lavoro extra e di sovraccarico. Il percorso migliore è quello di utilizzare Xamarin.Forme esclusivamente per il vostro punto di vista, o l’uso specifico per la piattaforma nativa di vista.

    Ecco uno screenshot da Xamarin è Xamarin.Pagina del form (foto scattata il 13 Maggio, 2015):

    Come utilizzare Xamarin.Controlli del Form e i Controlli Nativi Sulla stessa pagina

  5. 0

    È possibile creare un nuovo Activity che è sostenuto da Xamarin.Forms ereditando da Xamarin.Forms.Platform.Android.AndroidActivity e avviare questa nuova attività da un altro uno in Xamarin.Applicazione Android.

    • Sì, lo so che. Il problema è Xamarin.Le forme.Piattaforma.Android.AndroidActivity ha un solo Metodo SetPage(Xamarin.Le forme.Pagina pagina) che mostra la Xamarin.Forma la Pagina a schermo intero. Quello che voglio è la mia Attività ho molte altre nativo di Android Controlli. E In mezzo a quei Controlli che voglio usare il mio uno Xamarin.Pagina del form o Vista.

Lascia un commento