代码之家  ›  专栏  ›  技术社区  ›  Mike

Xamarin:NameScope中已存在键为“X”的元素

  •  0
  • Mike  · 技术社区  · 4 年前

    当我尝试推送到新页面时,我遇到了以下错误。

    (我使用的是Xamarin的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 }
    

    这个错误似乎很简单,所以我回去重命名了元素,然后在我的项目中搜索了相同的名称。(只有一个)。重新编译并重试,消息相同,但使用了新名称?所以我删除了元素,尝试重新编译并重试,有趣的是,我得到了相同的消息,但下一个元素?所以现在我在想,也许错误信息不太正确,或者试图告诉我其他事情。我就是想不出来。下面是我的名字。

    <?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>
    

    代码背后:

      [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;
               }
    
            }
        }
    

    任何帮助都将不胜感激。 迈克

    0 回复  |  直到 4 年前
        1
  •  14
  •   Mike    4 年前

    在我的代码后面,我有 初始化组件(); 宣布两次。

        2
  •  1
  •   Vishnu Kishore Tarini    2 年前

    是的,我也遇到了同样的异常,当我检查坏代码后面的代码时,有两个InitializeComponent();在代码后面。

        3
  •  0
  •   DuDa William Halliday    4 年前

    当系统试图初始化同名组件时,通常会出现此类问题。请检查 InitializeComponent(); 也许,它已经宣布了两次。

        4
  •  0
  •   Joao Soares    2 年前

    在我的例子中,我试图将组件绑定到它的“代码隐藏类”,而不是它的“视图模型”。我在做:

    <Picker
        BindingContext={x:Reference x:Name=ThisPage} 
    />
    

    问题是 x:Name=ThisPage 当我将其更改为 Name=ThisPage 它工作得很好。