如何从对象中获取Xamarin.Forms元素的名称?
像Button
,Entry
,Label
,Picker
等的视图可以具有x:Name
属性。如何从对象中获取Xamarin.Forms元素的名称?
<Label x:Name="myLabelName" Text="Some text" />
x
被定义为xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
。
现在我想处理未分类的项目,因此我使用object
作为类型。
如何从object
获得x:Name
属性作为字符串的代码?在这个阶段我不知道这种类型。
编辑:
为了让事情更清楚,我想发布一些代码。我有一个正常的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"
x:Class="XamlSamples.HelloXamlPage">
<Label x:Name="myLabelName" Text="Some text" />
</ContentPage>
在代码隐藏文件,我可以,如果我做nameof(this.myLabelName)
得到了x:Name
属性。但是,如果只有object
,这是如何完成的?
public partial class HelloXamlPage
{
public HelloXamlPage()
{
InitializeComponent();
List<string> itemsWhichPassTheCheck = this.Check(new List<object>() { this.myLabelName });
}
}
private List<string> Check(List<object> itemList)
{
// do some check here ...
// here I have only object and I want to get the x:Name attribute thereof
}
我100%肯定有一种方法重构你的代码,以避免你的需要,但回答的缘故,这里是你如何能得到任何物体的名称:
我们肯定知道用x:Name
标记的任何对象将创建一个同名的字段。
所以,使用反射,您应该能够获取页面中定义的所有字段,将它们与您的对象进行比较,并在匹配时返回字段名称。
我没有测试过这一点,但应该工作,或至少把你在正确的轨道上
string GetNameOf(object topLevelXaml, object reference)
{
var fields = topLevelXaml.GetType().GetFields();
foreach (var fi in fields) {
var value = fi.GetValue(topLevelXaml);
if (value != reference)
continue;
return fi.Name;
}
return null;
}
但同样,你不应该大概需要这个的。
由于其保护级别*我无法访问*'ReflectionExtensions.GetFields(Type)'。现在我使用'GetRuntimeFields()'来取代名称。对于'topLevelXaml'我使用'this'(当前页面)。但你是对的,我会重新思考我的方法。 – testing
当你想得到元素的属性名称。我的意思是当事件或何时加载? –
不知道你的意思。用户按下一个按钮,然后我想进行一些检查。在这里我需要访问name属性。 – testing