【问题标题】:Styling a MapPolygon为 MapPolygon 设置样式
【发布时间】:2012-02-05 03:46:51
【问题描述】:

我打算为MapPolygon 创建一个Style,但除了从Control 继承的属性之外,我似乎无法添加Setter,这并没有太大帮助,因为MapPolygon 实际上并没有使用其中的许多属性。

我主要希望能够设置FillStrokeStrokeThickness 属性的样式。但是,当我尝试执行此操作时,我收到以下错误:“对象引用未设置为对象的实例”。我是否认为这是因为我尝试设置样式的属性不是依赖属性 (DependencyProperty)?

如果我在这里的想法确实是正确的,那么解决这个问题的最简单方法是创建自定义MapPolygon 控件并为FillStrokeStrokeThickness 创建依赖属性吗?

如果我需要澄清一些事情,请告诉我。

更新:

public class StyledMapPolygon : MapPolygon {
    public static readonly DependencyProperty FillProperty =
       DependencyProperty.Register("Fill", typeof(Brush), typeof(StyledMapPolygon),
       new PropertyMetadata(new SolidColorBrush(), new PropertyChangedCallback(OnFillChanged)));

    private static void OnFillChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        StyledMapPolygon instance = (StyledMapPolygon) d;
        instance.Fill = e.NewValue as Brush;
    }
}

.

<Style x:Key="CustomStyle" TargetType="exts:StyledMapPolygon">
        <Setter Property="Fill" Value="{StaticResource BuildingFillBrush}" />
</Style>

这只是我想使用的样式的简化版本。 StyledMapPolygon 是我创建的继承自 MapPolygon 的对象。唯一的区别是我为“填充”创建了一个 DependencyProperty,它只映射到基本属性。

上面提到的错误仍然出现在Setter 中的“填充”上,但它现在可以正常工作(在手机上正确显示)。我可以忍受那里的错误,因为它仍然运行,但我非常希望我的应用程序没有错误。

【问题讨论】:

  • 显示您的代码(尤其是导致异常的行),而不仅仅是描述它。
  • 我用我已经取得的进展更新了这个问题。 @Matt - 我的代码并不那么重要。我只想知道如何从Style 正确设置MapPolygon 的Fill 属性。
  • 所以你说的是“我该怎么做 X?”。如果你可以说“我正在尝试做 X。我正在做......但我有这样那样的问题/例外。”,你会得到更多的帮助。
  • 在大多数情况下我会同意,但这个问题似乎很简单和笼统,以至于提供代码会更令人困惑而不是有用。但是,我还是用代码更新了这个问题。

标签: silverlight windows-phone-7 bing-maps


【解决方案1】:

是的,属性必须是DependencyProperty 才能被样式设置。

在基类上添加自己的包装属性的依赖属性没有任何问题,但我不建议尝试使用相同的属性名称。创建一个不同命名的属性,使用属性更改处理程序来中继设置到基础属性的值。

当然,如果您提到的“错误”是 Intellisense,那么只要代码编译并运行,就真的没有理由关心。

【讨论】:

  • 感谢您对我的DependencyProperty 假设的确认。忽略错误的问题是我实际上对其他几个属性做同样的事情,比如StrokeStrokeThickness 等,而且我有很多StyledMapPolygon 的样式。因此,我最终遇到了 60 多个错误,这让我很难看到我确实需要关心的其他错误和警告。
  • 您是否尝试过使用不同的属性名称?我怀疑这可能是您错误的根源。因此,请尝试使用“MyFill”(或更好的名称!)作为更改集填充的依赖属性,并在样式中使用 MyFill - 如果 CLR 属性和同名 - 这不是预期的工作方式。
  • DependencyProperty 的名称更改为常规属性名称以外的名称确实消除了错误。但是,这会产生一个新错误,指出它找不到“MyFill”,因为 ti 只是 DependencyProperty 而不是 CLR 属性。所以我还必须添加另一个属性来消除第二个错误。似乎有很多额外的代码来消除智能感知错误......
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多