Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 使用超过144个装饰器_Wpf_Adorner - Fatal编程技术网

Wpf 使用超过144个装饰器

Wpf 使用超过144个装饰器,wpf,adorner,Wpf,Adorner,在没有任何破损的情况下工作的装饰件的最大数量是144 我有一个带有一堆对象的滚动视图,其中很多都带有装饰。前144个装饰条的位置正确,但其余装饰条的位置不正确。请注意,当有这么多人时,这是一种例外情况;通常只有零个装饰器。尽管如此,我希望即使在那个特殊的场合也能正常工作 撇开这个任意的(非常低的)限制给我的感觉不谈,这个bug有什么实际的解决方法吗?目前还没有已知的解决方法 这也不错,因为我发现表现很差;简单地将本应显示装饰器的图像控件子类化,并在OnRender中绘制覆盖,效果就更好了(而且与

在没有任何破损的情况下工作的装饰件的最大数量是144

我有一个带有一堆对象的滚动视图,其中很多都带有装饰。前144个装饰条的位置正确,但其余装饰条的位置不正确。请注意,当有这么多人时,这是一种例外情况;通常只有零个装饰器。尽管如此,我希望即使在那个特殊的场合也能正常工作


撇开这个任意的(非常低的)限制给我的感觉不谈,这个bug有什么实际的解决方法吗?

目前还没有已知的解决方法


这也不错,因为我发现表现很差;简单地将本应显示装饰器的图像控件子类化,并在
OnRender
中绘制覆盖,效果就更好了(而且与WinForms不同,视觉效果可以扩展到控件的逻辑边界之外)。

这对这里的聚会来说可能太晚了,但这似乎解决了我的问题。我保存了添加到装饰器层(称为m_装饰器)的装饰器列表,并在包含装饰器的根控件中,附加到LayoutUpdate事件。下面是事件处理程序:

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

以下是我成功实施此问题训练的场景:

我有许多链接到Excel文档的文本框。 文本框采用数值。它们被设置为在xaml代码中出现数据错误时失效。如果数字小于1或为空,则会发生数据错误。 我在文本框周围放置了一个AdorneDecorator(以便红色无效边框正确显示在文本框上)。 在Excel中,您可以同时更改所有文本框-但是,正如OP所发现的,如果您一次成功使144个以上的文本框无效,装饰装饰器装饰器将开始播放,从而抵消边框的位置(这正是它最初设计用来修复的)

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


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

如果装饰器的位置设置了动画,则问题可能与此有关。我注意到144是(在某些条件下)动画变换的最大数量。还有一个是神奇的144。我的动画不是直接设置的,而是附加在前后滚动的控件上。