0

我有一个用户控件,其中包含一个图像、一个文本框和一个按钮。它实现了MeasureOverride()and ArrangeOverride(),它基本上考虑了文本框的 Text 属性来调整自身的大小。

但是......ArrangeOverride()并且在设置文本之前MeasureOverride()只调用一次。通过数据绑定更改/更新文本后,它们不会再次被调用以重新计算。

我知道 WPF 中有一个AffectsRender元数据标志,还有一个InvalidateVisual,但我在 Windows 8 运行时领域。我怎么能在这里做到这一点?

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,或强制布局循环。SizeChangedInvalidateMeasureInvalidateArrangeUpdateLayout

于 2013-01-05T22:16:39.140 回答