2010-05-12 38 views
0

我正在开发(使用Silvelight 3)创建某种时间线并在其上放置对象的应用程序。为此我需要一个非常大的Canvas(宽度高达2000000像素),但是每当我创建Canvas甚至是40000像素宽度时,它的行为都非常奇怪,随机消失。Silverlight中大画布的问题

我在silverlight forumsstackoverflow上发现了一篇文章,描述了完全相同的问题。这似乎是自silverlight 2以来已知的问题,但我无法找到任何好的解决方法。有谁知道这种解决方法或可以检查它仍然是Silverlight 4中的一个问题?

在此先感谢。

+1

创建一个自定义控件是否会更好地绘制刚刚在屏幕外(或重绘时间轴)和管理自定义滚动条的时间线的下一个(或上一个)部分? – Lazarus 2010-05-12 12:08:27

+0

当我发现问题时,这是我的第一个想法。但后来我想,也许有一个非常规的常见解决方案。 – Fury 2010-05-14 10:08:13

回答

1

一个响应的SO问题提到从点

的代表性问题源于“当心:一个 的Silverlight画布的最大尺寸为32767点 这是因为大小。 UI元素的 未存储为浮点数,因为它是在 WPF,但其中在32个数量 16比特形成大小的整数和 16比特形成它的浮动部分。

有足够的精度但没有足够的范围。一种可能的解决方案是在您将其添加到画布时将所有点缩放到允许的范围内。例如,除以1024将使您的200万像素下降到ca的范围。 2000年,在这个范围之内,并且预测1/1024,它也在精度范围之内。 (我们基本上只是将整个32位值,整数和小数部分移位10个位置,所以精度没有损失,但是范围增加。)

您甚至可以创建自定义容器来执行此映射为你。

+0

不幸的是,缩放也是我的应用程序的任务之一,即我必须能够将每100像素的缩放时间线改变1秒。所以这不是我的情况的解决方案。不过谢谢你的回答。 – Fury 2010-05-12 12:36:22

+2

我想你是从抽象的坐标空间混合屏幕分辨率。你可以在屏幕上作为你使用的坐标变换。本质上,坐标位于逻辑问题空间中,并且呈现是屏幕空间。您使用变换将窗体的逻辑空间转换为屏幕空间。这可以解决您的问题,大型坐标值和缩放比例。请参阅UIElement上的RenderTransform。 – mdma 2010-05-12 14:27:36

+0

“我认为你是从抽象坐标空间混合屏幕分辨率” 确实是我。非常感谢这个建议。我已经解决了我的特殊问题,但我会记住未来的转变。 – Fury 2010-05-14 10:19:04