Silverlight Style Setter看不到属性

时间:2011-11-16 15:27:50

标签: silverlight styles

我正在尝试从bing map silverlight类中将样式应用于MapPolyline。

我定义了这种风格:

<Style x:Key="routeStyle" TargetType="map:MapPolyline">
    <Setter Property="Stroke">
        <Setter.Value>
            <SolidColorBrush Color="Magenta" />
        </Setter.Value>
    </Setter>
    <Setter Property="StrokeThickness" Value="10" />
</Style>

运行时出现此错误:

  

在'Microsoft.Maps.MapControl.MapPolyline'类型中找不到属性'Stroke'。

与此相反:

http://msdn.microsoft.com/en-us/library/microsoft.maps.mapcontrol.mappolyline_members.aspx

我想知道是否可能正在努力寻找属性,因为它是在基类中声明的。所以我尝试了这个:

<Style x:Key="routeStyle" TargetType="mapCore:MapShapeBase">
    <Setter Property="Stroke">
        <Setter.Value>
            <SolidColorBrush Color="Magenta" />
        </Setter.Value>
    </Setter>
    <Setter Property="StrokeThickness" Value="10" />
</Style>

但仍然有:

  

在'Microsoft.Maps.MapControl.Core.MapShapeBase'类型中找不到属性'Stroke'。

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:1)

StrokeStrokeThickness不是依赖项属性,因此在样式或模板中不可用。这两个属性在整个WPF中都是统一的非dp。

作为一种解决方法,您可以从MapPolyLineEx类创建自己的派生类,例如MapPolyLine,您可以创建new实现(使用隐藏C#的基类成员功能) StrokeStrokeThickness作为依赖属性

答案 1 :(得分:1)

Stroke和StrokeThickness不受为该类定义的DependencyProperties的支持。在内部,他们使用Shape类的Stroke(Thickness)属性字段。一个选项是为每个定义您自己的DependencyProperty,在PropertyChangeCallback中,您可以使用关联的Shape类的DP来设置对象的值。这将成为本地值(而不是样式值)的缺点,但它应该适用于基本场景。 e.g。

public static class ShapeExtensions
{
    #region Stroke
    public static readonly DependencyProperty StrokeProperty =
        DependencyProperty.RegisterAttached("Stroke", typeof(Brush), typeof(ShapeExtensions),
            new PropertyMetadata((Brush)null, new PropertyChangedCallback(OnStrokeChanged)));

    public static Brush GetStroke(DependencyObject d)
    {
        return (Brush)d.GetValue(StrokeProperty);
    }

    public static void SetStroke(DependencyObject d, Brush value)
    {
        d.SetValue(StrokeProperty, value);
    }

    private static void OnStrokeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        d.SetValue(Shape.StrokeProperty, e.NewValue);
    }
    #endregion // Stroke
}