【问题标题】:How do I set the name of a Label in Xamarin Forms如何在 Xamarin Forms 中设置标签的名称
【发布时间】:2014-09-07 15:59:01
【问题描述】:

我正在尝试为标签添加名称,以便使用 Content.FindByName() 方法找到它

据我所知,Xamarin.Forms.Label() 类没有 Name 属性

这是我的页面类

public class HelloWordCodePage : ContentPage
{
    public Label HelloWorldLabel;

    public HelloWordCodePage()
    {
        HelloWorldLabel = new Label{Text = "Hello World", };
        ConstructView();
    }

    public void ConstructView()
    {
        Content = new StackLayout
        {
            Children =
            {
                HelloWorldLabel
            }
        };
    }
}

【问题讨论】:

  • 如果您在代码中制作它,为什么不以某种方式保留引用?

标签: xamarin xamarin.forms


【解决方案1】:

如果你在 Xaml 中定义你的标签,你可以使用这个语法:

<Label x:Name="YourLableName" Text="A simple Label" />

然后像这样在后面的代码中访问它

YourLableName.Text = "bla bla"

但是,如果您不使用 Xaml,并且您的所有页面定义都在后面的代码中找到,您应该保留对该标签的引用以便访问它,而不是使用 Content.FindByName&lt;&gt;() 作为 @Sten Petrov 找到它评论了

【讨论】:

    【解决方案2】:

    我相信该名称仅用于在 XAML 中创建元素时使用。如果您查看继承,您会在底部找到Element,它显式地实现了 INameScope。您不能将 Label 转换为 INameScope,因为这是一个内部接口:

    namespace Xamarin.Forms
    {
        internal interface INameScope
        {
            object FindByName(string name);
    
            void RegisterName(string name, object scopedElement);
    
            void UnregisterName(string name);
        }
    }
    

    【讨论】:

      【解决方案3】:

      名称是在渲染处理阶段分配的。由于您正在处理跨平台的ContentPage,此时无需知道呈现的名称。

      有一个GUID,但就像你说的没有ID。在我看来,您不会希望在这种高级页面设计中为生成的控件获取特定于平台的 ID。如果你这样做了,那么也许你需要创建一个特定于平台的 PageRenderer 来代替?

      当您开始编写 CustomRenderers 并创建特定于平台的控件时,如果您希望任何自定义控件平台特定的实现,您可以分配 ID。

      请记住当前的 ContentPage - 您已经有一个 class-scoped 对象引用到您的名为 HelloWorldLabel 的标签,您可以使用它来执行时更改其在页面上的外观等。

      【讨论】:

        【解决方案4】:

        样式标识

        使用 StyleId 属性来识别应用程序中的各个元素 用于在 ui 测试和主题引擎中进行识别。

        【讨论】:

        【解决方案5】:

        正如 IdoT 所说,如果您在运行时定义一个对象,则需要保留对该对象的引用才能访问它,因为无法指定名称。 我使用这样的字典:

        Dictionary<Guid, String> ControlsDictionary = new Dictionary<Guid, string>(); 
        

        然后当我创建一个对象时:

        Button bt = new Button {Text="Yay!"};
        
                bt.Clicked += OnButtonClicked;
                StackLayout.Children.Add(bt);
        
                ControlsDictionary.Add(bt.Id, "myname");
        

        在 Click 事件处理程序中,我可以识别发件人“姓名”:

        async void OnButtonClicked(object sender, EventArgs args)
            {
        
                Button btn = (Button)sender;
                String NameofButton = ControlsDictionary[btn.Id];
        
            }
        

        您也可以从“名称”中获取 ID:

        Guid IdfromName = ControlsDictionary.First(x => x.Value == "myname").Key;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-20
          • 1970-01-01
          • 2020-10-23
          • 1970-01-01
          • 2019-12-02
          • 2015-11-19
          相关资源
          最近更新 更多