0

画像、テキストボックス、ボタンを含むユーザーコントロールがあります。とを実装MeasureOverride()ArrangeOverride()ます。これは基本的に、テキストボックスのTextプロパティを考慮に入れてサイズを変更します。

しかし...ArrangeOverride()そしてテキストが設定される前MeasureOverride()に一度だけ呼び出されます。データバインディングを介してテキストが変更/更新された後、再計算のために再度呼び出されることはありません。

AffectsRenderWPFにメタデータフラグがあり、また、が存在することは知っていますが、InvalidateVisual私はWindows8ランタイムランドにいます。ここでこれを行うにはどうすればよいですか?

protected override Size MeasureOverride(Size availableSize)
{
  Size panelDesiredSize = new Size();

  m_textbox.Measure(availableSize);

  if (m_textbox.DesiredSize.Height < m_textbox.MinHeight)
  {
    panelDesiredSize = new Size(
      m_textbox.DesiredSize.Width, m_textbox.MinHeight);
  }
  else
  {
    panelDesiredSize = m_textbox.DesiredSize;
  }

  return panelDesiredSize;
}

protected override Size ArrangeOverride(Size finalSize)
{
  double x = 0;
  double y = 0;

  m_textbox.Arrange(new Rect(new Point(x, y), finalSize));
  m_button.Arrange(new Rect(new Point(x, y), finalSize));
  m_image.Arrange(new Rect(new Point(x, y), finalSize));

  m_button.Width = finalSize.Width;
  m_button.Height = finalSize.Height;

  m_image.Width = finalSize.Width;
  m_image.Height = finalSize.Height;

  return finalSize; // Returns the final Arranged size
}
4

1 に答える 1

1

これは Silverlight の状況に似ていると思います。メタデータの空想はありません。適切な要素にプロパティの変更/イベント ハンドラーを設定し、無効化をトリガーする必要があります。したがって、たとえば、TextChangedまたは関心のある要素のイベント ハンドラーを登録し、いずれかSizeChangedを呼び出すかInvalidateMeasure、レイアウト サイクルを強制します。InvalidateArrangeUpdateLayout

于 2013-01-05T22:16:39.140 に答える