Ленивая инициализация, вызывающая исключение System.ArgumentException в бета-версии Silverlight 2.0

У меня есть следующий пример, работающий на простой странице 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 является свойством зависимости?


person Shunyata Kharg    schedule 09.10.2008    source источник
comment
Релиз-кандидат 1 теперь доступен, возможно, стоит его попробовать.   -  person John    schedule 09.10.2008
comment
Спасибо, Джон. Согласно microsoft.com/silverlight/resources/install.aspx, у меня есть установлена ​​последняя версия Silverlight 2.0 [Silverlight 2 Beta 2 GDR 1 (2.0.30523.8)]   -  person Shunyata Kharg    schedule 09.10.2008


Ответы (3)


Спасибо за ваши ответы и комментарии.

Я могу запустить точно такой же код в приложении WPF, и он не даст сбоев. Для меня это явный признак того, что это ошибка Silverlight. Я сейчас не думаю, что это имеет какое-либо отношение к свойствам зависимостей.

person Shunyata Kharg    schedule 09.10.2008

Тот факт, что StrokeDashArray является свойством зависимости, не должен иметь ничего общего с отказом этого кода, поскольку в XAML вы постоянно устанавливаете свойства зависимости, которые обрабатываются во время синтаксического анализа в InitializeComponent.

Я бы сказал, что проблема в том, что в вашем коде вы повторно используете одну и ту же двойную коллекцию для каждой строки. Всякий раз, когда вы пытаетесь установить дочерние элементы для разных родителей, SL завершается неудачно с исключением аргумента, то же самое и при повторном использовании ресурса, который не является стилем. Похоже, для каждой строки нужен свой DoubleCollection.

person Santiago Palladino    schedule 09.10.2008
comment
Ммм, я могу без проблем использовать ту же кисть повторно. Попробуйте создать новое свойство кисти в приведенном выше коде, и вы увидите, что той же проблемы не возникает. Я не думаю, что это общая проблема с повторным использованием. Думаю, это может быть ошибка. - person Shunyata Kharg; 09.10.2008
comment
Работает с кистями, работает со стилями; он не будет работать почти со всем остальным. Я согласен с тем, что это должна быть ошибка, поскольку повторное использование DoubleCollection имеет смысл, но, по крайней мере, это лучшее объяснение вашей ошибки. - person Santiago Palladino; 09.10.2008
comment
Я понимаю. По крайней мере, я не единственный, кто это испытал! Спасибо за уделенное время! - person Shunyata Kharg; 09.10.2008

Я предполагаю, что настоящий вопрос в том, что вы пытаетесь здесь сделать? Вы действительно хотите, чтобы все строки использовали одну и ту же коллекцию DoubleCollection? Очевидно, что вы, вероятно, делаете намного больше, и это просто хороший способ поделиться вопросом, но вам, вероятно, следует предоставить каждой строке отдельную коллекцию. Довольно просто сделать с:

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

Вам действительно нужно разделять StoreDashArray между строками, а затем также выставлять его как свойство в вашем классе? Я бы поискал другие способы написания этого кода.

person Bryant    schedule 09.10.2008
comment
Что ж, я знал об альтернативе, как я сказал в своем исходном посте. Думаю, дело в том, что код должен работать, но не работает. В этом смысле у меня нет выбора, кроме как поискать другие способы написания :-) - person Shunyata Kharg; 09.10.2008