Ленивая инициализация вызывает System.ArgumentException в бета-версии Silverlight 2.0 - PullRequest
1 голос
/ 09 октября 2008

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

Ответы [ 3 ]

1 голос
/ 09 октября 2008

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

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

0 голосов
/ 09 октября 2008

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

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

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

0 голосов
/ 09 октября 2008

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

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

...