如何在Xamarin表单中设置标签的名称

8wtpewkr  于 2022-12-07  发布在  其他
关注(0)|答案(6)|浏览(196)

我正在尝试向标签添加名称,以便可以使用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
            }
        };
    }
}
qgzx9mmu

qgzx9mmu1#

如果在Xaml中定义标签,可以使用以下语法:

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

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

YourLableName.Text = "bla bla"

但是,如果不使用Xaml,并且所有页面定义都在后面的代码中,则应该保留对该标签的引用以便访问它,而不是像@ StenPetrov所评论的那样使用Content.FindByName<>()来查找它

ftf50wuq

ftf50wuq2#

我相信这个名称只在用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);
    }
}
kdfy810k

kdfy810k3#

名称是在Render处理阶段分配的。此时不需要知道呈现的名称,因为您正在处理跨平台的ContentPage
有一个 GUID,但就像你说的,没有 ID。在我看来,你永远不会想在这么高的页面设计级别上为生成的控件获得一个特定于平台的ID。如果你想这样做,那么也许你需要创建一个特定于平台的PageRenderer来代替?
当您开始编写 CustomRenderers 并创建特定于平台的控件时,如果您希望实现任何特定于平台的自定义控件,则可以分配ID。
请记住,在当前的ContentPage上,您已经有一个对名为HelloWorldLabel的标签的 * 类作用域 * 对象引用,您可以在执行时使用该对象在页面上更改其外观等。

vh0rcniy

vh0rcniy4#

样式ID
使用StyleId属性标识应用程序中的各个元素,以便在UI测试和主题引擎中进行标识。

elcex8rz

elcex8rz5#

正如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;
bvuwiixz

bvuwiixz6#

这是有点晚,但正在解决一些xamarin形式的问题,并记得我做了一些类似的事情在过去,在我开始实现MVVM。这是我如何使用Content.FindByName<>()是一个粗略的例子如下。

XAML格式

<BoxView Color="Gray" HeightRequest="2"  HorizontalOptions="Fill" />
                        <Label x:Name="DoorMaterial" x:Uid="41" Text="Door Material"/>
                        <RadioButton GroupName="Door_Material" x:Name="RB_99" Value="99" ClassId="41"  CheckedChanged="RB_CheckedChanged" Content="Wood" ></RadioButton>
                        <RadioButton GroupName="Material" x:Name="RB_100" Value="100" ClassId="41"  CheckedChanged="RB_CheckedChanged" Content="Steel" ></RadioButton>
                        <RadioButton GroupName="Material" x:Name="RB_101" Value="101" ClassId="41"  CheckedChanged="RB_CheckedChanged" Content="Upvc" ></RadioButton>
                        <RadioButton GroupName="Material" x:Name="RB_102" Value="102" ClassId="41"  CheckedChanged="RB_CheckedChanged" Content="Composite" ></RadioButton>

C语言#

private void SetPageFields(ICollection<DoorTemplateAnswerRecordModel> answerRecordModelsList)
    {

        string RadioButtonName = "RB_";

        foreach (var answerRecordModel in answerRecordModelsList)
        {
            
            var answerId = answerRecordModel.AnswerId.ToString();

            var combinedWihtId = RadioButtonName + answerId;

            var getCheckBox = Content.FindByName<RadioButton>(combinedWihtId);

            if (getCheckBox != null)
            {                   
                getCheckBox.IsChecked = true;
            }
        }
       

    }

相关问题