1

我在一个简单的 Silverlight 页面中运行了以下示例:

public Page()
{
  InitializeComponent();
  InitializeOther();
}

private DoubleCollection dashes;

public DoubleCollection Dashes
{
  get
  {
    //dashes = new DoubleCollection(); //works ok
    //dashes.Add(2.0);
    //dashes.Add(2.0);

    if (dashes == null)
    {
      dashes = new DoubleCollection(); //causes exception
      dashes.Add(2.0);
      dashes.Add(2.0);
    }
    return dashes;
  }
  set
  {
    dashes = value;
  }
}

private void InitializeOther()
{
  Line line;
  for (int i = 0; i < 10; i++)
  {
    line = new Line();
    line.Stroke = new SolidColorBrush(Colors.Blue);
    line.StrokeDashArray = Dashes; //exception thrown here
    line.X1 = 10;
    line.Y2 = 10;
    line.X2 = 400;
    line.Y2 = 10 + (i * 40);
    canvas1.Children.Add(line);
  }
}

上面的代码在标记的行上抛出 System.ArgumentException。示例中还标记了该问题的一种解决方案。

有谁知道这个问题是否与属性 System.Windows.Shapes.Shape.StrokeDashArray 是一个依赖属性有关?

4

3 回答 3

1

感谢您的回答和评论。

我可以在 WPF 应用程序中运行完全相同的代码并且它不会失败。对我来说,这清楚地表明这是一个 Silverlight 错误。我现在认为它与依赖属性没有任何关系。

于 2008-10-09T15:08:16.480 回答
0

StrokeDashArray 是一个依赖属性这一事实不应该与该代码失败有任何关系,因为在 XAML 中,您不断设置在 InitializeComponent 中解析期间处理的依赖属性。

我会说问题是在您的代码中,您为每一行重用了相同的双集合。每当您尝试将子项设置为不同的父项时,SL 都会因参数异常而失败,当您重用不是样式的资源时也是如此。似乎每一行都需要自己的 DoubleCollection。

于 2008-10-09T13:24:14.270 回答
0

我想这个真正的问题是,你想在这里做什么?您真的希望所有行共享同一个 DoubleCollection 吗?显然,您可能做的更多,这只是分享问题的好方法,但您可能应该为每一行提供自己的集合。很容易做到:

line = new Line();    
line.Stroke = new SolidColorBrush(Colors.Blue);
line.StrokeDashArray = **new DoubleCollection() { 2.0, 2.0 };**   
line.X1 = 10;    
...

你真的需要在行之间共享 StoreDashArray,然后将它作为你的类的属性公开吗?我会研究编写该代码的其他方法。

于 2008-10-09T17:27:30.580 回答