平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

昨日の続き

LoadContentを呼ぶとかそういうことはやめて、Measureの後にInvalidateMeasureを呼び、またMeasureを呼ぶことにしたらうまくいった。
ただ、ビジュアルツリーの子孫要素、全部に対してInvalidateMeasureを呼ばないといけなかった。
メモがてら。

protected override Size MeasureOverride(Size availableSize)
{
  base.MeasureOverride(availableSize);
  // いろいろ処理
  var selfAndDescendants = SelfAndDescendants(this);
  foreach(var item in selfAndDescendants)
  {
    ((UIElement)item).InvalidateMeasure();
  }
  return base.MeasureOverride(availableSize);
}

private static IEnumerable<DependencyObject> SelfAndDescendants(DependencyObject d)
{
  if (d == null) yield break;
  yield return d;
  for (int i = 0; i < VisualTreeHelper.GetChildrenCount(d); i++)
  {
    DependencyObject child = VisualTreeHelper.GetChild(d, i);
    foreach(DependencyObject item in SelfAndDescendants(child))
    {
      yield return item;
    }
  }
}