【问题标题】:Silverlight Style Setter can't see propertySilverlight 样式设置器看不到属性
【发布时间】:2011-11-16 15:27:50
【问题描述】:

我正在尝试将样式应用到来自 bing 地图 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”。

我是否遗漏了一些明显的东西?

【问题讨论】:

  • 从该链接中,我没有看到 MapPolyline 或 MapShapeBase 上的 Stroke 或 StrokeThickness 暴露的任何 DependencyProperty。你确定这是一个依赖属性吗?
  • 控件似乎正在使用 Shape 类的 DP,所以我怀疑这是问题所在。您也许可以执行 Property="Shape.StrokeProperty" 之类的操作。
  • 啊哈哈。我正在查看这部分文档,它没有提到任何关于为 DP 服务的内容。 msdn.microsoft.com/en-us/library/… 当然,当您深入了解特定文档时,它会提到它必须是 DP:msdn.microsoft.com/en-us/library/…
  • 我刚刚尝试过 Property="shapes:Shape.StrokeProperty",但在“MapPolyline”类型中找不到属性“StrokeProperty”。所以它似乎也行不通。
  • AndrewS:是否愿意将此添加为答案,以便我可以将其标记为这样?因为你是和我一起解决这个问题的人,甚至提出了建议。

标签: silverlight styles


【解决方案1】:

为该类定义的 DependencyProperties 不支持 Stroke 和 StrokeThickness。在内部,他们使用 Shape 类的 Stroke(Thickness)Property 字段。一种选择是为每个属性定义您自己附加的 DependencyProperty,并且在 PropertyChangeCallback 中您可以使用关联的 Shape 类的 DP 来设置对象的值。这将具有作为本地值(而不是样式值)的缺点,但它应该适用于基本场景。例如

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
}

【讨论】:

  • 这正是我一直试图发布的解决方法,作为我想出的答案。不幸的是堆栈溢出不会让我在另外 6 个小时内自行回答......但幸运的是你已经将它提供给所有人看:) 非常感谢你的指点!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多