我在一个简单的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属性是依赖属性这一事实有关?
答案 0 :(得分:1)
感谢您的回答和评论。
我可以在WPF应用程序中运行完全相同的代码,但不会失败。对我来说,这清楚地表明它是一个Silverlight错误。我现在不认为它与依赖属性有任何关系。
答案 1 :(得分:0)
StrokeDashArray是一个依赖属性的事实不应该与该代码失败有关,因为在XAML中你经常设置在InitializeComponent解析期间处理的依赖属性。
我想问的是,在你的代码中,你为每一行重复使用相同的双重集合。每当您尝试将子项设置为不同的父项时,SL都会失败并出现参数异常,当您重用不是样式的资源时也是如此。好像每一行都需要自己的DoubleCollection。
答案 2 :(得分:0)
我想这个真正的问题是,你想在这做什么?你真的希望所有的线路共享同一个DoubleCollection吗?显然你可能做得更多,这只是分享问题的好方法,但你应该给每一行自己的集合。很容易做到:
line = new Line();
line.Stroke = new SolidColorBrush(Colors.Blue);
line.StrokeDashArray = **new DoubleCollection() { 2.0, 2.0 };**
line.X1 = 10;
...
你真的需要在行之间共享StoreDashArray,然后将它作为你的类中的属性公开吗?我会研究编写代码的其他方法。