我试图通过扩展Picker控件并添加TextColor属性并在Android(和iOS最终)平台上拥有自定义渲染器来组合两个概念,扩展标准控件和This SO question。我可以成功设置TextColor属性并让它显示颜色,如果它静态设置如下:
<controls:ExtendedPicker TextColor="Red"/>
此过程的最后一步是能够从动态资源中提取属性,并使其能够在运行时更改。
<controls:ExtendedPicker Style="{DynamicResource pickerStyle}"/>
然后,在Application.Resources ResourceDictionary中:
<Color x:Key="textColor"/>
...
<Style x:Key="pickerStyle" TargetType="controls:ExtendedPicker">
<Setter Property="TextColor" Value="{DynamicResource textColor}" />
</Style>
请注意,这种选择TextColor的方法适用于本机控件,例如Label。代码编译并运行,但在运行时更改时似乎没有获取动态资源颜色设置。我假设这是我在我的自定义渲染器中处理此问题时所遗漏的内容,但我不知道该寻找什么。
答案 0 :(得分:0)
要在运行时处理此问题,我必须覆盖
OnElementPropertyChanged
自定义渲染器中的方法而不是
OnElementChanged
方法
答案 1 :(得分:0)
覆盖OnElementChanged
自定义平台相关渲染,您可以通过Xamarin.Forms
属性获取对基于e.NewElement
的自定义(子类)控件的引用。
因此,您可以将e.NewElement
转换为自定义控件并获取该类属性(您在XAML中指定的自定义选择器颜色):
(e.NewElement as ExtendedPicker).TextColor;
这样的事情:
protected override void OnElementChanged (ElementChangedEventArgs< ExtendedPicker> e)
{
base.OnElementChanged (e);
if (Control == null) {
~~~~~~
}
if (e.OldElement != null) {
~~~~~~
}
if (e.NewElement != null) {
var myPickerControl = (e.NewElement as ExtendedPicker). TextColor;
// Assign `myPickerControl` to your UI dependent control
~~~~~~~
}
}