向自定义UI库中定义的类添加样式

时间:2018-07-24 09:26:39

标签: xamarin.forms xamarin.forms-styles

当前,我正在开发一个UI库,该库应该包含自定义UI元素,布局和对话框,以便具有一致且可重用的UI集合。

在我的项目中,当前结构如下:

  • UILib(库的共享代码)
  • UILib.Droid(包含自定义渲染等的Android库)
  • UILib.iOS(包含自定义渲染器等的iOS库)
  • UILibDemo(使用库的演示应用程序的共享代码)
  • UILibDemo.Droid(Android演示应用程序)
  • UILibDemo.iOS(演示应用程序iOS)

在我的库中,我有一个“ LoadingDialog”类,到目前为止,它可以正常工作。 但是我的问题是我现在正在尝试定义一种样式,以从演示应用程序(App.xaml)的共享代码中更改LoadingDialog的某些属性:

<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:dialogs="clr-namespace:UILib.Dialogs;assembly=UILib"
         x:Class="BetterUIDemo.App">
<Application.Resources>
    <ResourceDictionary>
        <x:String x:Key="DefaultFontLight">OpenSans-Light.ttf</x:String>
        <Color x:Key="ThemeColor">#f08c00</Color>
        <Color x:Key="BackgroundColor">#37474f</Color>

        <Style x:Key="LoadingDialogStyle" TargetType="dialogs:LoadingDialog">
            <Setter Property="ThrobberBackgroundColor" Value="White" />
            <Setter Property="LabelFontFamily" Value="{DynamicResource DefaultFontLight}" />
            <Setter Property="LabelColor" Value="{DynamicResource ThemeColor}" />
            <Setter Property="LoadingText" Value="Lade Daten ..." />
        </Style>
    </ResourceDictionary>
</Application.Resources>

我的LoadingDialog类也包含以下属性:

#region Properties
    public static BindableProperty ThrobberBackgroundColorProperty = BindableProperty.Create("ThrobberBackgroundColor", typeof(Color), typeof(Color), Color.Black);
    public static BindableProperty FontFamilyProperty = BindableProperty.Create("FontFamily", typeof(string), typeof(string), Font.Default.FontFamily);
    public static BindableProperty LabelColorProperty = BindableProperty.Create("LabelColor", typeof(Color), typeof(Color), Color.Black);
    public static BindableProperty LoadingTextProperty = BindableProperty.Create("LoadingText", typeof(string), typeof(string), "Loading ...");

    public string LabelFontFamily
    {
        get { return (string)GetValue(FontFamilyProperty); }
        set { SetValue(FontFamilyProperty, value); }
    }

    public Color ThrobberBackgroundColor
    {
        get { return (Color)GetValue(ThrobberBackgroundColorProperty); }
        set { SetValue(ThrobberBackgroundColorProperty, value); }
    }

    public string LoadingText
    {
        get { return (string)GetValue(LoadingTextProperty); }
        set { SetValue(LoadingTextProperty, value); }
    }

    public Color LabelColor
    {
        get { return (Color)GetValue(LabelColorProperty); }
        set { SetValue(LabelColorProperty, value); }
    }

    #endregion

但是,当我尝试编译演示应用程序时,出现以下错误:

  

严重性代码描述项目文件行抑制状态   错误位置14:13。无法在LoadingDialog UILibDemo C上解析LabelFontFamily C:\ Work \ UILib \ UILibDemo \ UILibDemo \ App.xaml 14

有什么建议我可能做错了吗?

2 个答案:

答案 0 :(得分:1)

我认为这可能只是引起您错误的命名原因。

可绑定属性使用一些“魔术”,其中Property namebindable property需要命名为同一事物,但可绑定属性的末尾带有 Property 字样< / p>

注意如何将您的BindableProperty简称为FontFamily

将其更改为以下内容可以纠正您的错误

public static BindableProperty LabelFontFamilyProperty = BindableProperty.Create("LabelFontFamily", typeof(string), typeof(string), Font.Default.FontFamily);

public string LabelFontFamily
{
   get { return (string)GetValue(FontFamilyProperty); }
   set { SetValue(FontFamilyProperty, value); }
}

答案 1 :(得分:0)

解决了。进一步参考:

问题是注册为“ FontFamily”的BindableProperty与实际属性不匹配

public string LabelFontFamily
{
    get { return (string)GetValue(FontFamilyProperty); }
    set { SetValue(FontFamilyProperty, value); }
}

将属性更改为

  

公共字符串FontFamily

解决了该问题。