如何使用 Xamarin.forms 访问自定义 类 中的对象名称?

How to access object name in custom classes using Xamarin.forms?

最近我开始使用Xamarin.Forms进行开发。我正在创建一个应用程序,我必须在其中自定义按钮,因此我创建了 customButton class。现在,我想使用 object.name 属性 访问自定义 class 中的按钮,但我做不到。谁能建议我该怎么做。

代码

<local:CustomButton x:Name="signInButton"  Text="Sign In" Clicked="OnLoginButtonClicked"  TextColor ="White" FontSize="15" FontAttributes="Bold"/>

自定义按钮 class 在 Android 项目中

namespace Sample.Droid
{
    class CustomButtonRenderer : ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {

                //Want to access button name in if condition, instead of Control.
                //Hope this will help you all in understanding my problem.
            }
        }
    }
}

谢谢

首先,我不确定你有没有,你需要在你的命名空间的顶部添加这行代码:

[assembly: ExportRenderer(typeof(CustomButton), typeof(CustomButtonRenderer))]

其次,在您的代码中您可以访问元素本身,例如:

if (control != null)
{
    string buttonText = Element.Text; //In your posted case it will be equal to "Sign In"
}

我不确定您是否真的可以从 CustomRenderer 内部访问 x:Name 属性,因为它是 class 变量名。但这取决于您尝试的内容您是否拥有可以使用的所有 Element 对象。

编辑

我找不到直接访问名称 属性 的方法,但您可以解决这个问题。
在您的 PCL 项目和您的 CustomButton class 中,您可以添加您想要的 属性:

public class CustomButton : Button
{
    public string Name { get; set; }
    //rest of your code
}

在您的 xaml 页面中,您现在可以将其添加为 属性,例如:

<local:CustomButton x:Name="signInButton" Name="signInButton" Text="Sign In" Clicked="OnLoginButtonClicked"  TextColor ="White" FontSize="15" FontAttributes="Bold"/>

然后在我之前向您展示的渲染器中,您现在可以这样做:

if (Control != null)
{
    string buttonName = ((CustomButton)Element).Name; //it will have the "signInButton" now.
}

I can't use the Element.Text property as I will remove the text and set image to my button. I need to use either Tag or Name property

Name是在Render处理阶段分配的,对于android平台,正如我所说,通常我们使用id来标识控件。这里好像不能暴露属性这个名字,一个解决方法是我们可以通过注册一个BindableProperty来暴露一个属性。例如:

public class MyButton : Button
{
    public string ButtonName
    {
        get { return (string)GetValue(ButtonNameProperty); }
        set { SetValue(ButtonNameProperty, value); }
    }

    public static readonly BindableProperty ButtonNameProperty =
        BindableProperty.Create(
            propertyName: "ButtonName",
            returnType: typeof(string),
            declaringType: typeof(MyButton),
            defaultValue: null,
            propertyChanged: OnButtonNameChanged);

    private static void OnButtonNameChanged(BindableObject bindable, object oldValue, object newValue)
    {
    }
}

后面的代码:

public class MyButtonRenderer : ButtonRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
    {
        base.OnElementChanged(e);
        //Element.Id

        if (Element != null)
        {
            var element = Element as MyButton;
            var name = element.ButtonName;
        }
    }
}

你的代码有个小问题,自定义渲染器中的Control表示各个平台的原生控件,Element是你的自定义控件,所以我用了Element 属性 这里。

并使用此控件:

<local:MyButton x:Name="signInButton" Text="custom button" ButtonName="signInButton" />

我知道在使用自定义 Button 时两次设置名称 属性 很烦人,但这是我目前找到的唯一一种从渲染器为每个自定义按钮获取标签的方法.如果你不需要在 PCL 后面的代码中访问这个 Button,那么也许你不需要设置 x:Name 属性。