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