如何在XAML [Xamarin.Forms]中使用String以外的Type设置自定义属性值 - c#

在XAML的Xamarin.Forms中,您可以编写如下内容:

<Entry Keyboard="Plain" />

我调查了Entry类,并且Keyboard属性的类型为Xamarin.Forms.Keyboard。但是,如果我创建自己的自定义ContentView并在其中写入如下内容:

    public static readonly BindableProperty KeyboardProperty = BindableProperty.Create
    (
        propertyName: "Keyboard",
        returnType: typeof(Keyboard),
        declaringType: typeof(MyCustomContentView),
        defaultValue: Keyboard.Default,
        defaultBindingMode: BindingMode.TwoWay,
        propertyChanged: (bindable, oldValue, newValue) =>
        {
            // some unrelated stuff here
        }
    );
    public Keyboard Keyboard
    {
        get => (Keyboard)GetValue(KeyboardProperty);
        set => SetValue(KeyboardProperty, value);
    }

我不能对自己的内容视图使用相同的XAML格式。显然,这是一个简单的字符串,在其中需要Xamarin.Forms.Keyboard类的实例。到目前为止,我已经发现它与KeyboardProperty或绑定无关,但是与Keyboard属性本身无关(如果我是对的)。我相信这与ValueConverters有关,当XAML解析器到达此部分时,我必须定义某种形式的字符串转换为Keyboard,似乎无法找到我需要做的回答。

参考方案

Petzold在他关于Xamarin.Forms的漂亮书中很好地解释了您的问题的答案(您可以免费下载here!)。
在第7章的属性和属性部分的末尾,您可以阅读

...您可以在XAML中包括自定义类,并且这些类可以具有自定义类型的属性,或者这些属性可以是标准类型,但允许附加值。您所需要的只是使用C#TypeConverter属性标记这些类型或属性,并提供派生自TypeConverter的类。

还有一些好奇的细节
(从上述书中简单引用)
在该章中,Petzold通过给出一个带有Label的示例来说明这一点:

<Label Text="Hello from XAML!"        
       IsVisible="True"
       Opacity="0.75" 
       HorizontalTextAlignment="Center" 
       VerticalOptions="CenterAndExpand" 
       TextColor="Blue" 
       BackgroundColor="#FF8080" 
       FontSize="Large" 
       FontAttributes="Bold,Italic" /> 

然后继续说明XAML如何设置这些属性。

XAML的简洁性主要来自属性值的简洁性(例如,使用单词“ Large”而不是对Device.GetNamedSize方法的调用)。这些缩写未内置到XAML解析器中。相反,XAML解析器由专门为此目的定义的各种转换器类辅助。
当XAML解析器遇到Label元素时,它可以使用反射来确定Xamarin.Forms是否具有一个名为Label的类,如果是,则可以实例化该类。现在可以初始化该对象了。 Text属性的类型为字符串,并且属性值仅分配给该属性。
Label的IsVisible和Opacity属性分别为bool和double类型,它们与您期望的一样简单。 XAML解析器使用Boolean.Parse和Double.Parse方法转换属性值。 Boolean.Parse方法不区分大小写,但在XAML中,布尔值通常大写为“ True”和“ False”。 Double.Parse方法传递了CultureInfo.InvariantCulture参数,因此转换不取决于程序员或用户的本地文化。
Label的Horizo​​ntalTextAlignment属性的类型为TextAlignment,它是一个枚举。对于任何属于枚举类型的属性,XAML解析器都使用Enum.Parse方法将字符串从值转换为值。
VerticalOptions属性是LayoutOptions类型的结构。当XAML分析器使用反射引用LayoutOptions结构时,它发现该结构具有定义的C#属性:

[TypeConverter (typeof(LayoutOptionsConverter))] 
public struct LayoutOptions 
{ 
    … 
}

名为TypeConverterAttribute的类支持TypeConverter属性。 LayoutOptions上的此特定TypeConverter属性引用了一个名为LayoutOptionsConverter的类,该类派生自一个名为TypeConverter的公共抽象类,该类定义了名为CanConvertFrom和ConvertFrom的方法。当XAML解析器遇到此TypeConverter属性时,它将实例化LayoutOptionsConverter。 XAML中的VerticalOptions属性被分配了字符串“ Center”,因此XAML解析器将该“ Center”字符串传递给LayoutOptionsConverter的ConvertFrom方法,然后弹出LayoutOptions值。这被分配给Label对象的VerticalOptions属性。

Xamarin Forms按钮单击事件在运行时崩溃 - c#

我正在Xamarin中针对Windows,iOS和Android编辑一个应用程序。在可移植项目中,当编辑xaml文件时,我添加了以下按钮:<Button x:Name="Marker_Detection" Text="Marker Detection" Grid.Row="0" Grid.Co…

当应用加载但未在前台运行时,如何使我的应用发出通知? - c#

我有一个有时会使用的应用程序。我睡觉之前一定把它留在后台。醒来时,我在屏幕上看到此通知。有人对我如何在XF应用程序中显示这样的通知有任何建议吗?另外,这些通知还会出现在Android上吗?我从未在Android手机上看到它们,但这可能是因为我使用的次数少了。 参考方案 我们可以使用Shiny.Notifications NuGet Package在Xamar…

Forms.py文件应该放在哪里? - python

我现在开始写我的第一个Django项目,我需要为应用创建我的forms.py文件。我见过一些教程将文件存储在项目的主文件夹下,而另一些则存储在app目录中。如果我想制作仅适用于一个应用程序的表单,哪种布局最适合我?是否可以制作多个文件来保存表单代码?谢谢! python大神给出的解决方案 这是标准布局:├── apps/ | ├── [app]/ | | ├…

如何自定义Xamarin形式的滑块? - java

我要自定义滑块,使其看起来如下图所示:我在.xaml文件中的代码:<Slider MaximumTrackColor="Black" MinimumTrackColor="Black" HeightRequest="50" ThumbColor="Black" ThumbI…

Xamarin.Forms目标框架(Kitkat)问题 - c#

我有一个Xamarin Forms中的项目,该项目以Target Framework作为Oreo即8.0开始。但是我的应用程序在低端设备上经常崩溃,因此我决定降级为Android 4.4作为目标框架。我将所有的nuget软件包降级为合适的版本。但是我仍然收到以下错误:max res 19, skipping values-v21 "max res …