来自DynamicResource的自定义控件属性

时间:2016-05-03 14:48:17

标签: xaml xamarin xamarin.forms

我试图通过扩展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。代码编译并运行,但在运行时更改时似乎没有获取动态资源颜色设置。我假设这是我在我的自定义渲染器中处理此问题时所遗漏的内容,但我不知道该寻找什么。

2 个答案:

答案 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
            ~~~~~~~
        }
    }