UWP:使用DefaultValue ThemeResource的DependencyProperty

时间:2016-05-27 09:27:11

标签: c# xaml uwp dependency-properties

我有一个自定义的UIElement,其中FontIcon为正文。

FontIcon具有Foreground属性,我想将其绑定到DependencyProperty

DependencyProperty声明如下:

public static readonly DependencyProperty ForegroundColorProperty = DependencyProperty.Register( "ForegroundColor", typeof( Brush ),
                                                                  typeof( ColorableCheckbox ),
                                                                  new PropertyMetadata( null, null ) );

public Brush ForegroundColor
  {
     get { return (Brush)GetValue( ForegroundColorProperty ); }
     set { SetValue( ForegroundColorProperty, value ); }
  }

在我的声明中,defaultValue的{​​{1}}为空,我希望这是PropertyMetadata的值。

遗憾地使用

ThemeResource

不起作用,它会出错:

<FontIcon x:Name="Glyph"
          FontFamily="Segoe UI Symbol"
          Glyph="&#xE001;"
          FontSize="20"
          Foreground="{Binding Path=ForegroundColor,FallbackValue={ThemeResource SystemControlHighlightAltChromeWhiteBrush}}" />

如何将默认值设置为{DynamicResource} can only be used with dependency property ?在代码隐藏中使用ThemeResource还是在XAML中?

1 个答案:

答案 0 :(得分:1)

如果您调用方法在PropertyMetadata中的属性更改回调中设置“Glyph”的前景,该怎么办。

这样的事情......

public static readonly DependencyProperty ForegroundColorProperty = DependencyProperty.Register("ForegroundColor", typeof(Brush), typeof(ColorableCheckbox), new PropertyMetadata(null, UpdateForeground));

private static void UpdateForeground(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
    var ctrl = (ColorableCheckbox) obj;
    var brush = args.NewValue as Brush;

    if (brush == null)
        return;

    ctrl.Glyph.Foreground = brush;
}

或者在XAML中为您的用户控制一个名称并将其设置为绑定的源。

e.g。

<UserControl x:Name="ColorCheckbox"...>
   <FontIcon x:Name="Glyph"
          FontFamily="Segoe UI Symbol"
          Glyph="&#xE001;"
          FontSize="20"
          Foreground="{Binding ForegroundColor,FallbackValue={StaticResource SystemControlHighlightAltChromeWhiteBrush}, ElementName=ColorCheckbox}" />
</UserControl>