我正在尝试为标签添加名称,以便我可以使用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
}
};
}
}
答案 0 :(得分:10)
如果您在Xaml中定义标签,则可以使用此syntex:
<Label x:Name="YourLableName" Text="A simple Label" />
然后像这样
在后面的代码中访问它YourLableName.Text = "bla bla"
但是,如果您不使用Xaml,并且所有页面定义都在后面的代码中找到,那么您应该保留对该标签的引用,以便访问它而不是使用Content.FindByName<>()
找到它正如@Sten Petrov所评论的
答案 1 :(得分:1)
我认为该名称仅用于在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);
}
}
答案 2 :(得分:0)
名称在渲染处理阶段分配。当您正在使用跨平台 ContentPage 时,无需知道呈现的名称。
有一个 GUID ,但就像你说没有 ID 一样。在我看来,您不希望在这个高级别的页面设计中获得生成的控件的特定于平台的ID。如果您这样做,或许您需要创建一个特定于平台的 PageRenderer ?
当您开始编写 CustomRenderers 并创建特定于平台的控件时,如果您希望任何自定义控件平台特定的实现,则可以分配ID。
请记住当前的 ContentPage - 您已经将类范围的对象引用到名为 HelloWorldLabel 的标签,您可以使用在执行时更改页面上的外观等。
答案 3 :(得分:0)
StyleId
使用StyleId属性标识应用程序中的各个元素 用于ui测试和主题引擎中的识别。
答案 4 :(得分:0)
正如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;