【问题标题】:Using more than 144 adorners使用超过 144 个装饰器
【发布时间】:2012-02-01 13:43:40
【问题描述】:

It appears 可以正常工作的装饰器的最大数量为 144 个。

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

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

【问题讨论】:

  • 如果装饰器的位置是动画的,问题可能与this question有关。我注意到 144 是动画变换的最大数量(在某些条件下)。
  • 还有this question 也遇到了神奇的 144 数字。我的不是直接动画,但它们附加到来回滚动的控件上。

标签: wpf adorner


【解决方案1】:

目前还没有已知的方法。

这也不错,因为我发现性能很差;只需将应该显示装饰器的 Image 控件子类化,并在 OnRender 中绘制叠加层,效果会更好(并且与 WinForms 不同,视觉效果可以扩展到控件的逻辑边界之外)。

【讨论】:

    【解决方案2】:

    这是我设法针对这个问题实施锻炼的场景:

    我有许多链接到 Excel 文档的文本框。 文本框采用数值。它们被设置为对 xaml 代码中的数据错误无效。如果数字

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

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

    【讨论】:

      【解决方案3】:

      这对这里的聚会来说可能有点晚了,但这似乎为我解决了问题。我保留了已添加到装饰层(称为 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();
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2017-09-25
        • 1970-01-01
        • 2016-05-31
        • 2022-08-13
        • 2016-07-26
        • 2011-09-03
        • 1970-01-01
        • 2013-12-06
        • 2016-04-29
        相关资源
        最近更新 更多