6

看起来,可以正常工作且没有任何破损的装饰器的最大数量是 144。

我有一个带有一堆对象的 ScrollView,其中许多都带有装饰器。前 144 个装饰器的位置正确,但其余的则不正确。请注意,当有这么多时,这是一种例外情况;通常,装饰者恰好为零。尽管如此,即使在那个特殊的场合,我也希望它能够正常工作。

撇开这个任意(而且非常低)的限制让我感觉如何,是否有任何实际的解决方法来解决这个错误?

4

3 回答 3

3

目前没有已知的方法可以做到这一点。

这也很好,因为我发现性能很差;简单地将我应该显示装饰器的 Image 控件子类化,并在OnRender.

于 2012-03-22T23:12:43.797 回答
2

这是我设法针对此问题进行锻炼的场景:

我有许多链接到 Excel 文档的文本框。文本框采用数值。它们被设置为对 xaml 代码中的数据错误无效。如果数字 < 1 或 null,则会发生数据错误。我在文本框周围放置了一个 AdornerDecorator(这样红色的无效边框就可以正确显示在文本框上)。在 Excel 中,您可以同时更改所有文本框 - 但是,正如 OP 发现的那样,如果您设法一次使超过 144 个文本框无效,则装饰器开始播放,偏移边框的位置(这就是它旨在首先修复)。

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

这样,无论我想一次更改多少个单元格,装饰器总是显示在正确的位置(除了最后一个要评估的文本框,尽管我尽了最大的努力,但总是如此轻微地错位)。

于 2016-11-15T08:58:01.350 回答
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();
        }
    }
于 2015-10-23T21:08:14.790 回答