使用超过144个装饰者

时间:2012-02-01 13:43:41

标签: wpf adorner

It appears,无破损工作的最大装饰者数量为144。

我有一个包含大量对象的ScrollView,其中许多都带有装饰者。前144个装饰者的位置正确,但其余的不是。请注意,当有这么多时,这是一种特殊的情况;通常只有零个装饰品。尽管如此,我希望即使在那个特殊场合也能正常工作。

暂且不谈这个任意(和非常低)的限制让我感觉到,这个错误是否有任何实际的解决方法?

3 个答案:

答案 0 :(得分:3)

此时没有已知的方法。

也是如此,因为我发现表现差;简单地继承我应该显示装饰器的Image控件,并在OnRender中绘制叠加层,工作得更好(与WinForms不同,视觉效果可以超出控件的逻辑边界)。

答案 1 :(得分:2)

以下是我设法为此问题实施锻炼的方案:

我有许多链接到Excel文档的文本框。 文本框采用数值。它们设置为使xaml代码中的数据错误无效。如果数字是<1,则发生数据错误。 1,或null。 我在文本框周围放置了一个AdornerDecorator(以便在文本框上正确显示红色失效边框)。 在Excel中,您可以同时更改所有文本框 - 但是,正如OP发现的那样,如果您设法同时使144个文本框无效,则装饰器装饰器开始播放,抵消边框的位置(非常重要)它的目的是为了解决问题。)

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

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

答案 2 :(得分:0)

这可能是派对的迟到,但这似乎解决了我的问题。我保留了我添加到adorner层(称为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();
        }
    }