在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的HorizontalTextAlignment属性的类型为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 …