2 votes

Le UserControl de Xamarin ne se charge pas dans XAML mais fonctionne dans le code arrière

J'essaie d'utiliser un usercontrol défini en dehors de la solution en faisant référence à la dll. Cela fonctionne si j'utilise le code, mais pas XAML.

Voici le code - 1. Code UserControl

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xamarin.Forms;
using Xamarin.Forms.Internals;

namespace ComplexControl
{
    [Preserve]
    public class ComplexControl : ContentView
    {
        public ComplexControl()
        {
            var button = new Button
            {
                Text = "Click Me!",
                //VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand,
            };

            int clicked = 0;
            button.Clicked += (s, e) => button.Text = "Clicked: " + clicked++;

            Content = button;
        }
        [AttributeUsage(AttributeTargets.Class, Inherited = false)]
        class PreserveAttribute : Attribute { }
    }
}
  1. Pour l'utilisation dans le projet, je référence l'assemblage ConplexControl en PCL.

Il fonctionne avec du code (c'est-à-dire sans utiliser XAML).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using ComplexControl;

namespace CustomControlUsageExample
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            // without InitializeComponent(); works
            //this way works
            //Step 1.
            StackLayout sl = new StackLayout();
            Label lb = new Label();
            lb.Text = "Hello";
            sl.Children.Add(lb);
            sl.Children.Add(new ComplexControl.ComplexControl());
            Content = sl;
        }
    }
}

Si je l'utilise avec XAML, cela ne fonctionne pas.

Comme ceci

XAML est

<?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:local="clr-namespace:CustomControlUsageExample"
             x:Class="CustomControlUsageExample.MainPage"
             xmlns:custom="clr-namespace:ComplexControl;assembly:ComplexControl">
    <StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <Label Text="Welcome to Xamarin Forms!"/>
        <custom:ComplexControl.ComplexControl/>
    </StackLayout>

</ContentPage>

Et le code derrière cela est

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using ComplexControl;

namespace CustomControlUsageExample
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            //This way does not work
            //Step 2

            InitializeComponent();
        }
    }
}

J'ai déjà essayé de le déboguer et je ne le vois pas ajouter le contrôle de l'utilisateur au contenu.

Quelqu'un peut-il m'aider à voir ce que je fais mal ? Cela fonctionne si je n'utilise pas XAML pour le contrôle personnalisé.

J'ai un travail sur le contrôle d'utilisateur où le contrôle d'utilisateur est fait en utilisant du code, mais il sera référencé par des projets dans XAML.

Merci,

1voto

Alex Sorokoletov Points 1095

XP, vous faites tout correctement.

Malheureusement, une petite erreur de frappe ( : au lieu de =) vous a conduit à ce problème avec le contrôle défini par XAML.

xmlns:custom="clr-namespace:ComplexControl;assembly:ComplexControl"

devrait être

xmlns:custom="clr-namespace:ComplexControl;assembly=ComplexControl"

Syntaxe pour espace de noms XAML personnalisé es clr-namespace:NAMESPACE;assembly=ASSEMBLY

Je pense que Xamarin.Forms devrait être plus intelligent en ce qui concerne les espaces de noms et vous avertir de ces erreurs dans l'éditeur ou pendant la construction (Xamarin.Forms ne compile pas XAML par défaut, mais personne ne l'empêche de lancer un simple contrôle syntaxique, n'est-ce pas ?)

Si vous voulez, vous pouvez déposer un bug auprès de Xamarin (c'est facile !)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X