Search code examples
xamlxamarin.forms

Xamarin : An element with the key 'X' already exists in NameScope


I'm getting the following error when I try to push to a new page.

(I'm using Xamarin.Form 4.6.0.800)

{System.ArgumentException: An element with the key 'NewAccountLogo' already exists in NameScope
Parameter name: name
  at Xamarin.Forms.Internals.NameScope.Xamarin.Forms.Internals.INameScope.RegisterName (System.String name, System.Object scopedElement) [0x0000e] in D:\a\1\s\Xamarin.Forms.Core\Internals\NameScope.cs:21 
  at amici.NewAccount.InitializeComponent () [0x00078] in C:\Users\X\source\repos\amici\amici\amici\obj\Debug\netstandard2.0\NewAccount.xaml.g.cs:46 
  at amici.NewAccount..ctor () [0x0000f] in C:\Users\X\source\repos\amici\amici\amici\NewAccount.xaml.cs:26 
  at amici.Logon+<OnCreateAccountClick>d__3.MoveNext () [0x0002a] in C:\Users\X\source\repos\amici\amici\amici\logon.xaml.cs:119 }

The error seems straight forward so I went back and renamed the element and then searched my project for the same name. (there is only one). Recompiled and tried it again, same message but with the new name? so I delete the element and tried recompiled and tried it again, interesting enough I get the same message but with the next element? So now I’m thinking maybe the error message is not quite right or is trying to tell me something else. I just can’t figure it out. Below is my 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"
             NavigationPage.HasNavigationBar="True"
             Title="New Account"
             x:Class="amici.NewAccount">
    <ContentPage.Content >
        <ScrollView>
            <Grid>
                <StackLayout Margin="20" Padding="10" AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1">
                    <Image x:Name="NewAccountLogo"/>
                    <Entry x:Name="NewEmail" Placeholder="Email"/>
                    <Entry x:Name="EmailConfirm" Placeholder="Confirm Email"/>

                    <Label Text="Password between 6 and 20 characters; must contain at least one lowercase letter, one uppercase letter, one numeric digit." Margin="0,0,0,5"></Label>


                    <Entry x:Name="NewPassword" IsPassword="true" Placeholder="Password"/>
                    <Entry x:Name="PasswordConfirm" IsPassword="true" Placeholder="Confirm Password"/>

                    <Label x:Name="bntCreatAccountButton" TextColor="Blue" Text="Create Account" HorizontalOptions="Center" Margin="0,25,0,0">
                        <Label.GestureRecognizers>
                            <TapGestureRecognizer Tapped="OnCreateAccount" NumberOfTapsRequired="1" />
                        </Label.GestureRecognizers>
                    </Label>
                </StackLayout>
                <ActivityIndicator x:Name="WaitIcon"  IsRunning="{Binding IsBusy}" VerticalOptions="Center" HorizontalOptions="Center" />
            </Grid>
        </ScrollView>
    </ContentPage.Content>
</ContentPage>

code behind :

  [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class NewAccount : ContentPage
    {
        public NewAccount()
        {
            InitializeComponent ();

            this.InitializeComponent();
            this.BindingContext = this;
            this.IsBusy = false;

            var bkgrndGradient = new Gradient()
            {
                Rotation = 150,
                Steps = new GradientStepCollection()
                {
                    new GradientStep(Color.White, 0),
                    new GradientStep(Color.White, .5),
                    new GradientStep(Color.FromHex("#ccd9ff"), 1)
                }
            };

            ContentPageGloss.SetBackgroundGradient(this, bkgrndGradient);
            NewAccountLogo.Source = ImageSource.FromFile("logo.png");
        }



        async private void OnCreateAccount(object sender, EventArgs e)
        {

            string Message = string.Empty;
            string title = string.Empty;
            bool results = false;
            IsBusy = true;

            try
            {


                if (ComparisonBehavior.CompareValues(NewEmail.Text, NewPassword.Text, EmailConfirm.Text,PasswordConfirm.Text, ref Message, ref title))
                {

                    await Task.Delay(1000);
                    results = RestController.CreateAccount(NewEmail.Text, NewPassword.Text);
                    IsBusy = false;

                    if (results)
                    {
                        await DisplayAlert("New Account Created.", "Thank You! Please check your email (junk mail) to activate your subscription.", "OK");
                        await Application.Current.MainPage.Navigation.PopAsync();

                    }else
                    {
                        if (Application.Current.Properties["resp"].ToString() == "Account exist")
                        {
                            await DisplayAlert("Account Exist", "Sorry this email already exist!", "OK");
                        }

                    }
                }else
                {
                    await DisplayAlert(title, Message, "OK");
                }


            }catch (Exception ex)
            {
                 await DisplayAlert("internal Error", ex.Message, "OK");
            } finally{
                IsBusy = false;
           }

        }
    }

any help would be appreciated. Mike


Solution

  • In my Code behind I had InitializeComponent (); declared twice.