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