懒惰初始化在Silverlight 2.0测试版造成System.ArgumentException

问题描述 投票:1回答:3

我已经得到了下面的例子在一个简单的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是一个依赖属性?

.net silverlight silverlight-2.0
3个回答
1
投票

谢谢您的回答和评论。

我可以准确地运行在一个WPF应用程序相同的代码,它不会失败。对我来说,这是一个明显的迹象表明它是一个Silverlight错误。我现在不觉得它有什么关系依赖属性。


0
投票

事实上,StrokeDashArray是一个依赖属性不应该有任何与该代码失败,因为在XAML你不断地设定其在解析的InitializeComponent过程中处理依赖属性。

我会说,问题是,在你的代码要重复使用相同的双集合每一行。每当你尝试将儿童设置为不同的家长SL失败,参数异常,同样,当你重复使用的资源,是不是一种风格。好像每行需要自己DoubleCollection。


0
投票

我想这真正的问题是,什么是你想在这里做什么?你真的希望所有的线共享相同的DoubleCollection?显然,你可能做了很多,这就是共享问题的好办法,但你可能应该给每一行自己的收藏。很容易做的:

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

你真的需要共享StoreDashArray线之间,然后也暴露出它作为你的类的属性?我会考虑编写代码的其他方式。

© www.soinside.com 2019 - 2024. All rights reserved.