我有一个简单的处理程序,可以向一个空的Silverlight画布添加一个椭圆
private void UCLoaded(object sender, RoutedEventArgs e)
{
var geometry = MakeElipse(20, 15, new Point(100, 100));
var ellipsePath = new Path
{
Data = geometry,
Fill = new SolidColorBrush(Colors.DarkGray),
StrokeThickness = 4,
Stroke = new SolidColorBrush(Colors.Gray)
};
LayoutRoot.Children.Add(ellipsePath);
//
var duplicateEllipsePath = new Path();
//duplicateEllipsePath.Data = ellipsePath.Data;
duplicateEllipsePath.Data = geometry;
duplicateEllipsePath.Fill = ellipsePath.Fill;
duplicateEllipsePath.StrokeThickness = ellipsePath.StrokeThickness;
duplicateEllipsePath.Stroke = ellipsePath.Stroke;
LayoutRoot.Children.Add(duplicateEllipsePath);
}第一个椭圆ellipsePath很好,并按预期呈现。但是行duplicateEllipsePath.Data = ellipsePath.Data或可选的duplicateEllipsePath.Data = geometry都抛出System.ArgumentException“值不在预期范围内”。它怎么会在一次范围内,然后立即超出范围呢?在这样的代码中复制路径的正确方式是什么?
发布于 2012-09-15 23:57:29
看起来克隆路径的唯一方法是手动操作。引用this answer from Yi-Lun Luo
Data属性实际上是一个几何图形。虽然在Silverlight中不明显,但几何图形实际上依赖于底层系统资源(因为它需要绘制一些东西)。如果你需要绘制另一个几何图形,你将需要另一个系统资源。因此,在将其分配到新路径之前,必须对其进行克隆。在WPF中,我们在Geometry上有一个Clone方法,不幸的是Silverlight不支持这个方法。因此,您必须手动进行克隆。
易伦的另一篇帖子声称包含用于克隆几何体的反射代码,相同的代码似乎显示为here,尽管后者的格式更清晰。然而,在您的例子中,使用这样的方法似乎有点过分了。使用的几何体由MakeElipse sic方法创建。将生成几何图形的通用代码提取到一个方法中似乎是进行此操作的最佳方式。
错误消息“Value is not fall The expected range”有点误导人。我没有看到任何“超出范围”的东西,假设在你的第一个椭圆的范围内有完全相同的物体。我不能确切地说为什么会报告这个错误消息,但我可以推测。Silverlight是用本机代码实现的,我相信因为本机代码不能抛出异常,所以它会返回数字错误代码。也许错误代码的数量是有限的,“值不在预期范围内”的代码就是为这个错误选择的代码吗?
https://stackoverflow.com/questions/12437267
复制相似问题