【问题标题】:Lazy initialization causing System.ArgumentException in Silverlight 2.0 betaSilverlight 2.0 beta 中的延迟初始化导致 System.ArgumentException
【发布时间】:2010-09-16 05:50:41
【问题描述】:

我在一个简单的 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


【解决方案1】:

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

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

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

【讨论】:

  • 好吧,正如我在原始帖子中所说的那样,我知道替代方案。我想重点是代码应该可以工作,但不能。从这个意义上说,我别无选择,只能研究其他的写作方式:-)
【解决方案2】:

感谢您的回答和cmets。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 嗯,我可以毫无问题地重复使用同一个画笔。尝试在上面的代码中创建一个新的画笔属性,你会发现不会出现同样的问题。我认为这不是重用的普遍问题。我认为这可能是一个错误。
    • 它适用于画笔,适用于样式;它几乎无法与其他所有东西一起使用。我同意这应该是一个错误,因为重用 DoubleCollection 确实有意义,但它至少是对您的错误的最佳解释。
    • 我明白了。至少我不是唯一一个有过这种经历的人!感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 2014-12-15
    • 2020-05-10
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多