2016-09-30 2 views
0

Je tente de définir des composants réutilisables dans mon application xamarin. Mon intention est d'utiliser le même xaml dans plusieurs fichiers. Par exemple, je dois définir un en-tête commun pour mon application. J'ai essayé de l'implémenter de la manière suivante: Définir xaml requis dans un fichier séparé. Utilisez le nom de classe associé pour la réutilisation dans tout autre xaml.Implémenter des éléments réutilisables dans des formulaires xamarin

XAML réutilisables:

<?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="AppHeader" BackgroundColor="White" 
      Spacing="1" 
      VerticalOptions="Start"> 
    <StackLayout Padding="0,10,0,10" 
       BackgroundColor="Blue" 
       Orientation="Horizontal" 
       Spacing="0"> 
     <Label 
     Text="AppName" 
     HorizontalTextAlignment="Center" 
     HorizontalOptions="Center" 
     TextColor="White" 
      ></Label> 
    </StackLayout> 
</StackLayout> 

classe associée:

public partial class AppHeader : StackLayout 
    { 
     public AppHeader() 
     { 
      InitializeComponent(); 
     } 
    } 

Utilisation en 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:MyApp;assembly=MyApp" 
      x:Class="MyApp.SampleView"> 
<StackLayout> 
    <common:AppHeader></common:AppHeader> 
</StackLayout> 
</ContentPage> 

Pendant l'exécution de l'application, Im obtenir l'erreur suivante pour le fichier XAML réutilisable:

"Le nom 'InitializeComponent' n'existe pas dans le contexte actuel"

La mise en œuvre semble simple, mais je ne suis pas capable d'identifier ce qui manque. Une solution pour cela? Toute aide serait grandement appréciée. Merci

+0

Dans votre 'StackLayout' vous avez un attribut pour votre classe:' x:. class = « AppHeader » 'Si je ne me trompe pas, vous devez spécifier l'espace de noms complet là-bas ainsi que le nom de votre classe –

+0

Vous avez raison. Fournir l'espace de noms complet a résolu le problème – user3165999

+0

Laissez-moi le mettre à jour pour que vous puissiez l'accepter –

Répondre

0

Dans votre StackLayout vous avez un attribut pour votre classe. x:Class="AppHeader" Cela devrait indiquer le nom complet de la classe, y compris l'espace de noms . modifier donc à quelque chose comme:

<StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="YouNameSpace.AppHeader" BackgroundColor="White" 
      Spacing="1" 
      VerticalOptions="Start"> 
    <StackLayout Padding="0,10,0,10" ... 
+0

Sans les éléments InitializeComponent() de la page xaml commune ne seront pas affichés – user3165999

+0

va rayer cela alors;) –

0

Supprimez InitializeComponent(); de votre constructeur AppHeader. InitializeComponent() est seulement utilisé par ContentPage s.

En outre, juste remarqué le XML que vous avez dans votre AppHeader XAML. Un changement qui XAML à cette (enlever tous les XAML boilerplate qui est nécessaire que dans un ContentPage:

<StackLayout BackgroundColor="White" 
      Spacing="1" 
      VerticalOptions="Start"> 
    <StackLayout Padding="0,10,0,10" 
       BackgroundColor="Blue" 
       Orientation="Horizontal" 
       Spacing="0"> 
    <Label Text="AppName" 
      HorizontalTextAlignment="Center" 
      HorizontalOptions="Center" 
      TextColor="White"></Label> 
    </StackLayout> 
</StackLayout> 
+0

J'ai essayé de supprimer InitializeComponent(), mais les éléments du xaml commun ne sont pas affichés – user3165999