Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xaml 来自DynamicSource的自定义控件属性_Xaml_Xamarin_Xamarin.forms - Fatal编程技术网

Xaml 来自DynamicSource的自定义控件属性

Xaml 来自DynamicSource的自定义控件属性,xaml,xamarin,xamarin.forms,Xaml,Xamarin,Xamarin.forms,我试图将两个概念结合起来,一个是扩展标准控件,另一个是扩展Picker控件,添加TextColor属性,并在Android(以及最终的iOS)平台上使用自定义渲染器。我可以成功设置TextColor属性,并使其显示静态设置的颜色,如下所示: <controls:ExtendedPicker TextColor="Red"/> 此过程的最后一步是能够从动态资源中提取属性,并使其能够在运行时更改 <controls:ExtendedPicker Style="{Dynamic

我试图将两个概念结合起来,一个是扩展标准控件,另一个是扩展Picker控件,添加TextColor属性,并在Android(以及最终的iOS)平台上使用自定义渲染器。我可以成功设置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。代码可以编译并运行,但在运行时更改时,似乎不会选择动态资源颜色设置。我假设这是我在自定义渲染器中处理时缺少的东西,但我不知道要查找什么。

要在运行时处理这一点,我必须覆盖

OnElementPropertyChanged 
方法,而不是

OnElementChanged 

方法。

覆盖自定义平台相关呈现的
OnElementChanged
,您可以通过
e.NewElement
属性获取对基于
Xamarin.Forms
的自定义(子类)控件的引用

因此,您可以将
e.NewElement
转换为自定义控件,并获取该类属性(您在XAML中指定的自定义选择器颜色):

大概是这样的:

    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
            ~~~~~~~
        }
    }
protectedoverride void OnElementChanged(ElementChangedEventArgse)
{
碱基。一个元素改变(e);
if(Control==null){
~~~~~~
}
if(e.OldElement!=null){
~~~~~~
}
if(例如NewElement!=null){
var myPickerControl=(e.NewElement作为ExtendedPicker);
//将“myPickerControl”分配给依赖于UI的控件
~~~~~~~
}
}

OnElementChanged仅在创建时出现。在运行时更改它时,我;我发现只有在重写OnElementPropertyChanged方法时它才起作用。是的,如果您想在初始创建后更改颜色,您是正确的!,因为这将是一个道具的改变,而不是元素的改变。无论哪种方式,关键是您可以通过事件args访问自定义颜色,并且只需根据需要将其分配给控件
    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
            ~~~~~~~
        }
    }