2015-05-23 3 views
7

Ho più file xaml di ContentPage nel mio progetto Xamarin. Voglio incorporare una parte condivisa di xaml in ogni pagina di contenuto. Non c'è niente di particolarmente speciale nella parte condivisa di xaml (non è necessario fare nulla di specifico per la piattaforma). Non dovrebbe essere così semplice come incorporare un tag nella xaml di ContentPage per includere il file xaml condiviso? Qualcuno può indicarmi la giusta direzione?Xamarin.Forms: Posso incorporare una ContentPage o ContentView in un'altra ContentPage

risposta

4

Si può prendere il bambino genitore della tua pagina di contenuto (ad esempio, un stackLayout che avvolge tutti i bambini), metterlo in un file XAML esterno, e quindi includere tale componente in ognuna delle vostre pagine di contenuti.

* Il file xaml esterno sarà un tipo StackLayout anziché una pagina di contenuto.

** Edit - ha aggiunto un esempio di codice:

Aggiungiamo un colpo di testa stackLayout: aggiungiamo un codice dietro classe:

public partial class HeaderNavigationBar 
{ 
    public HeaderNavigationBar() 
    { 
     InitializeComponent(); 
    } 
} 

quindi aggiungere un codice XAML:

<StackLayout x:Class="HeaderNavigationBar" Orientation="Horizontal" 
      HorizontalOptions="FillAndExpand" Padding="10" BackgroundColor="White"> 


    <Image Source="burger_icon" HorizontalOptions="StartAndExpand" Aspect="AspectFit"> 
    <Image.GestureRecognizers> 
     <TapGestureRecognizer Command="{Binding SlideNavigationDrawerCommand}"/> 
    </Image.GestureRecognizers> 
    </Image> 
</StackLayout 

Infine, nella pagina in cui si desidera riutilizzare il componente, aggiungere questo riferimento: <HeaderNavigationBar></HeaderNavigationBar>

+0

Grazie. Questo mi farà avvicinare. Puoi dirmi qual è la sintassi per includere il file xaml esterno nelle mie pagine di contenuti? –

+0

controlla la risposta aggiornata – IdoT

+0

Avvicinandosi. Quando provo ad eseguirlo, mi dà questo errore nel file xaml: "x è spazio dei nomi non dichiarato". qualche idea? –

9

Grazie mille IdoT, ha funzionato per me, ma dopo aver aggiunto alcune linee. in quanto ciò aiuterà a creare modelli/controlli personalizzati/moduli secondari, facilmente aggiunto/condiviso su Xamarin.Forms.

e qui è il mio lavoro pieno, sulla base di suggerimenti, in modo che possa essere usato come è con gli altri:

HeaderNavigationBar.xaml

<?xml version="1.0" encoding="utf-8" ?> 
    <StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="App9.MVC.Views.HeaderNavigationBar" 

      Orientation="Horizontal" 
      HorizontalOptions="FillAndExpand" Padding="10" BackgroundColor="White"> 

    <Button Text="Internal 1" /> 
    <Button Text="Internal 2" /> 

    </StackLayout> 

Come si può vedere, ha aggiunto:

xmlns="http://xamarin.com/schemas/2014/forms" 
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 

e in the.cs, è stato dichiarato come StackLayout.

HeaderNavigationBar.cs

using Xamarin.Forms; 

namespace App9.MVC.Views 
{ 
public partial class HeaderNavigationBar : StackLayout 
{ 
    public HeaderNavigationBar() 
    { 
     InitializeComponent(); 
    } 
} 
} 

poi per la pagina che tenerlo/mostrarlo:

MainView.xaml

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     xmlns:common="clr-namespace:App9.MVC.Views;assembly=App9" 

     x:Class="App9.MVC.Views.MainView"> 

<StackLayout Padding="0,0,0,20"> 
<common:HeaderNavigationBar> 
    <Button Text="External 1" /> 
</common:HeaderNavigationBar> 

<Button Text="Test Button 1" x:Name="btnPage1" Clicked="btnPage1_clicked" /> 

</StackLayout> 
</ContentPage> 

come si può notare, lo spazio dei nomi è il percorso completo, in MainView:

xmlns:common="clr-namespace:App9.MVC.Views;assembly=App9" 

Inoltre, è possibile notare che è presente un pulsante denominato "Esterno 1", che verrà visualizzato anche con i pulsanti interni, in quanto il controllo è una visualizzazione stack, in modo che possa gestire l'aggiunta di ulteriori controlli.

come si vede qui:

enter image description here

anche per la pagina all'interno di un'altra pagina:

Ancora una volta grazie va a Idot.