将样式添加到自定义 UI 库中定义的 class
Adding a style to a class defined in a custom UI library
目前我正在开发一个 UI 库,该库应该包含自定义 UI 元素、布局和对话框,以便拥有一致且可重复使用的 UI 集合。
在我的项目中,当前结构如下:
- UILib(库的共享代码)
- UILib.Droid(android 包含自定义渲染等的库)
- UILib.iOS(iOS 包含自定义渲染器等的库)
- UILibDemo(使用库的演示应用程序的共享代码)
- UILibDemo.Droid(演示应用程序 Android)
- UILibDemo.iOS(演示应用程序 iOS)
在我的图书馆中,我有一个 class "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 class 也包含这些属性:
#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
然而,当我尝试编译演示应用程序时,出现以下错误:
Severity Code Description Project File Line Suppression State
Error Position 14:13. Can't resolve LabelFontFamily on LoadingDialog UILibDemo C:\Work\UILib\UILibDemo\UILibDemo\App.xaml 14
有什么我可能做错的建议吗?
解决了。进一步参考:
问题是注册为 "FontFamily" 的 BindableProperty 与实际的 属性
不匹配
public string LabelFontFamily
{
get { return (string)GetValue(FontFamilyProperty); }
set { SetValue(FontFamilyProperty, value); }
}
将 属性 更改为
public string FontFamily
问题已解决。
我认为这可能只是导致您出错的命名问题。
可绑定属性使用一些 "Magic",其中 Property name
和 bindable property
需要命名为相同的东西,但可绑定 属性 有单词 属性最后
注意你的 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); }
}
目前我正在开发一个 UI 库,该库应该包含自定义 UI 元素、布局和对话框,以便拥有一致且可重复使用的 UI 集合。
在我的项目中,当前结构如下:
- UILib(库的共享代码)
- UILib.Droid(android 包含自定义渲染等的库)
- UILib.iOS(iOS 包含自定义渲染器等的库)
- UILibDemo(使用库的演示应用程序的共享代码)
- UILibDemo.Droid(演示应用程序 Android)
- UILibDemo.iOS(演示应用程序 iOS)
在我的图书馆中,我有一个 class "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 class 也包含这些属性:
#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
然而,当我尝试编译演示应用程序时,出现以下错误:
Severity Code Description Project File Line Suppression State Error Position 14:13. Can't resolve LabelFontFamily on LoadingDialog UILibDemo C:\Work\UILib\UILibDemo\UILibDemo\App.xaml 14
有什么我可能做错的建议吗?
解决了。进一步参考:
问题是注册为 "FontFamily" 的 BindableProperty 与实际的 属性
不匹配public string LabelFontFamily
{
get { return (string)GetValue(FontFamilyProperty); }
set { SetValue(FontFamilyProperty, value); }
}
将 属性 更改为
public string FontFamily
问题已解决。
我认为这可能只是导致您出错的命名问题。
可绑定属性使用一些 "Magic",其中 Property name
和 bindable property
需要命名为相同的东西,但可绑定 属性 有单词 属性最后
注意你的 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); }
}