2008-10-09 43 views
1

造成System.ArgumentException我已經得到了下面的例子在一個簡單的Silverlight網頁運行:延遲初始化在Silverlight 2.0測試版

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是一個依賴屬性有關?

非常感謝任何提示!

+0

發佈候選1現在可用可能值得嘗試。 – John 2008-10-09 11:15:46

+0

謝謝約翰。根據http://www.microsoft.com/silverlight/resources/install.aspx我安裝了最新版本的Silverlight 2.0 [Silverlight 2 Beta 2 GDR 1(2.0.30523.8)] – 2008-10-09 13:41:46

回答

0

StrokeDashArray是一個依賴項屬性的事實不應該與該代碼失敗有任何關係,因爲在XAML中,您將不斷設置在InitializeComponent中解析期間處理的依賴項屬性。

我想說的問題是,在你的代碼中,你正在爲每一行重複使用相同的雙重集合。無論何時當你試圖設置一個孩子到不同的父母時,SL會失敗並帶有參數異常,當你重用一個不是樣式的資源時也是如此。似乎每一行都需要自己的DoubleCollection。

+0

嗯,我可以重複使用相同的刷子沒有問題。嘗試在上面的代碼中創建一個新的畫筆屬性,您將看到相同的問題不會發生。我不認爲這是重用的通用問題。我認爲這可能是一個錯誤。 – 2008-10-09 13:39:28

1

謝謝您的回答和評論。

我可以在WPF應用程序中運行完全相同的代碼,並且不會失敗。對我來說,這是一個明顯的跡象表明它是一個Silverlight錯誤。我現在不認爲它與依賴屬性有任何關係。

0

我想這個真正的問題是,你在這裏做什麼?你真的想要所有的行共享相同的DoubleCollection?很明顯,你可能會做更多的事情,這只是一個分享問題的好方法,但你應該爲每一行分配自己的集合。很容易與做:

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

你真的需要線之間共享StoreDashArray,然後也暴露出它作爲你的類的屬性?我會研究編寫該代碼的其他方式。