在Windows应用商店应用中有类似于Affect Render的东西吗?

时间:2013-01-05 08:58:28

标签: c# xaml windows-8 windows-runtime

我有一个用户控件,里面包含一个Image,一个TextBox和一个Button。 它实现了MeasureOverride()ArrangeOverride(),它基本上考虑了文本框的Text属性来调整自身的大小。

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

我知道WPF中有一个AffectsRender元数据标志,还有InvalidateVisual,但我在Windows 8 Runtime中。我怎么能在这里这样做?

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
}

1 个答案:

答案 0 :(得分:1)

我认为这与Silverlight中的情况类似。没有元数据的好处,您需要在适当的元素上设置属性更改/事件处理程序并触发失效。因此,例如在您感兴趣的元素的TextChangedSizeChanged之类的内容上注册事件处理程序,并调用InvalidateMeasureInvalidateArrange或{{1}之一强制布局周期。