如何在 C# 代码隐藏中使用 XAML 中定义的属性

How to use properties defined in XAML in the C# code-behind

我有一个带有 C# 代码隐藏的 XAML 文档。

C# class 中我定义了一些属性,然后我可以在 XAML 中设置:

public partial class MyClass : ContentView
{
    public Color MyColor { get; set; }

    public MyClass()
    {
        InitializeComponent()

        //Here I want to use the color
    }
}
<MyClass MyColor="Blue"/>

问题是从未设置 属性。当我尝试使用它时,它仍然具有默认值(白色)。

当我使用 BindableProperties:

时也会发生同样的情况
public static readonly BindableProperty MyColorProperty = BindableProperty.Create(nameof(MyColor), typeof(Color), typeof(MyClass), Colors.White);

public Color MyColor
{
    get => (Color)GetValue(MyColorProperty);
    set => SetValue(MyColorProperty, value);
}

你应该怎么做?我想使用 XAML 在此元素实例上设置的属性,但它不起作用。

图片 c# 代码而不是 xaml 可能会有所帮助。两者是等价的

如果您的组件的使用看起来像:

var c = new MyClass();
c.MyColor = Color.Blue;

那么构造函数中MyColor的值是多少?

很明显,还是白

要查看蓝色,请在任何方法覆盖中使用 MyColor。最常见的是 OnAppearing:

protected override void OnAppearing()
{
    base.OnAppearing();

    // use MyColor here.
}

解决方案是使用 OnHandlerChanged。经过一些实验,我可以确认 XAML 属性已经在这个阶段设置,并且每次都会调用它。

在代码中,它看起来像这样:

protected override void OnHandlerChanged()
{
    base.OnHandlerChanged();
    //Retrieve or use your properties
}

另一个建议的解决方案(如果您正在使用 ContentPage)是 OnAppearing.

方法

编辑:

进一步说明,这就是 Microsoft docsOnHandlerChanged 的看法:

HandlerChanged 在创建 cross-platform 控件的处理程序后引发。此事件表示实现 cross-platform 控件的本机控件可用,并且 cross-platform 控件上设置的所有 属性 值已应用于本机控件。