2012-02-01 55 views
5

It appears说,没有任何破损的工作装饰器的最大数量为144使用超过144个装饰器

我有一个滚动型与一群对象,其中不少都带有装饰器。前144名装饰者的位置正确,但其余的不是。请注意,这是一个特殊的情况,有这么多,通常完全没有装饰者。尽管如此,即使在那个特殊的场合,我也希望能够正常工作。

撇开这种随意(而且非常低)的限制让我感觉如何,这个bug有什么实际的解决办法吗?

+0

如果装饰者的位置是动画,问题可能与[此问题]有关(http://stackoverflow.com/questions/9049610/is-141-the-maximum-number-of-wpf-panel-items - 即,可以待动画-同时/ 9062419#9062419)。我注意到144是动画变换的最大数量(在某些条件下)。 – Clemens 2012-02-01 13:48:05

+0

还有[这个问题](http://stackoverflow.com/questions/7610608/onrender-method-does-not-work-with-more-than-144-controls),也会遇到魔法144号码。我的动画并非直接动画,而是附在可以前后滚动的控件上。 – 2012-02-01 13:49:20

回答

3

目前还没有这样做的已知方式。

这也是一样,因为我发现性能很差;简单地继承应该显示装饰器的图像控件,并在OnRender中绘制覆盖图,效果更好(不像WinForms,视觉可以超出控件的逻辑边界)。

0

这可能会迟到这里的派对,但这似乎解决了我的问题。我保留了一个已添加到装饰器层(称为m_adorners)的装饰器列表,并且在包含装饰器的根控件中,我附加了LayoutUpdated事件。这里的事件处理程序:

private void OnLayoutUpdated(object sender, EventArgs e) 
    { 
     if (m_adorners.Any(a => !a.IsArrangeValid && 
       a.Parent != null)) 
     { 
      AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this); 
      adornerLayer.InvalidateArrange(); 
     } 
    } 
2

这里是下我成功地实现了这个问题的训练场景:

我有一些链接到一个Excel文件文本框。 文本框取数值。它们被设置为使xaml代码中的数据错误无效。如果数字为< 1,则会发生数据错误,或为空。 我在文本框周围放置了一个AdornerDecorator(以便红色的无效边框在文本框上正确显示)。 在Excel中,您可以同时更改所有文本框 - 但是,如同OP发现的那样,如果您设法一次无效超过144个文本框,则装饰器装饰器开始播放,抵消边界位置它被设计为首先解决的事情)。

我尝试了许多不同的解决方案,包括使布局无效,但是这些方法都不适用于我面临的情况。 使用Snoop,我发现如果手动刷新文本框,装饰者就会正确放置自己。所以,我决定从每个需要装饰者的文本框中调用布局更新。我通过在文本框上监听OnValueUpdated来做到这一点。如果它正在更新的新值碰巧是一个无效值,我会为文本框强制使用“UpdateLayout()”(我只想对无效值执行此操作,因为强制更新会影响性能,而我不想每次价值改变时都要这样做)。

通过这种方式,无论我希望一次更改多少个单元格,装饰器装饰器总是显示在正确的位置(除了最后一个要评估的文本框,尽管我尽了最大的努力,它总是曾经如此轻微错位)。