【问题标题】:Custom Control Property from DynamicResource来自 DynamicResource 的自定义控件属性
【发布时间】:2016-05-03 14:48:16
【问题描述】:

我正在尝试通过扩展 Picker 控件并添加 TextColor 属性并在 Android(最终是 iOS)平台上使用自定义渲染器来组合两个概念,即扩展标准控件和 application theming。如果静态设置如下,我可以成功设置 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 等原生控件。代码编译并运行,但在运行时更改时似乎没有选择动态资源颜色设置。我假设这是我在自定义渲染器中处理此问题时缺少的东西,但不知道要寻找什么。

【问题讨论】:

    标签: xaml xamarin xamarin.forms


    【解决方案1】:

    为了在运行时处理这个问题,我必须重写

    OnElementPropertyChanged 
    

    自定义渲染器中的方法而不是

    OnElementChanged 
    

    方法。

    【讨论】:

      【解决方案2】:

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

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

      (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
                  ~~~~~~~
              }
          }
      

      【讨论】:

      • OnElementChanged 仅在创建时出现。在运行时更改它时,我发现它只有在我覆盖 OnElementPropertyChanged 方法时才有效。
      • 是的,如果您想在初始创建后更改颜色,您是对的!因为那将是道具更改,而不是元素更改。无论哪种方式,关键是您可以通过事件 args 访问您的自定义颜色,并且只需将其分配给您的控件
      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多