应从MeasureOverride返回的大小

时间:2013-12-27 07:54:17

标签: wpf windows-store-apps

控制如何说:我会占用父母给我的所有空间?

例如,我的控件位于ScrollVewer中。它用尺寸(无限,无限)测量我的控制。我的控件显示小图表。图表仍然看起来很好的最小尺寸是(300,300)。最大尺寸不受限制。我的控件应该从MeasureOverride()返回多大? (0,0)或(300,300)?

当availableSize是准确的大小时,MeasureOverride方法应该返回什么尺寸,例如(1234,1235)?

此问题与WPF和Windows 8 XAML应用程序相关。

4 个答案:

答案 0 :(得分:1)

MeasureOverride的参数是avaibleSize。顾名思义,这是控件可以使用/填充的最大大小。控件现在应该返回稍后将使用的实际大小。返回的大小可以是完整的给定大小或更小(例如,控件总是绘制正方形并且需要更少的空间)。

游戏与ScrollViewer略有不同。 ScrollViewer假装有无穷无尽的空间并将availableSize设置为无限。现在可以控制它来决定它有多大或者它喜欢的大小。但是如果窗口太小,控件必须知道它会滚动。顺便说一下,返回0/0表示你的控件不需要任何空格。

在您的情况下,滚动图表可能不是最佳方式。 lain提出的方法是解决这个问题的一种方法:让你的控件保持窗口的剩余空间,让你的控制在这些边界内扩展。

答案 1 :(得分:1)

正确的解决方案实际上是在MeasureOverride中返回0大小。或者需要最小尺寸。

然后将使用ScrollViewer的可用大小调用ArrangeOverride。

你可以尝试一下:

<Window x:Class="TestMeasure.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestMeasure"
        Title="MainWindow" Height="350" Width="525">
    <ScrollViewer>
    <local:MyTextBox Text="Hi"/>
  </ScrollViewer>
</Window>

using System.Windows;
using System.Windows.Controls;

namespace TestMeasure {
  class MyTextBox: TextBox {
    protected override System.Windows.Size MeasureOverride(System.Windows.Size constraint) {
      Size baseSize = base.MeasureOverride(constraint);
      return baseSize;
    }

    protected override System.Windows.Size ArrangeOverride(System.Windows.Size arrangeBounds) {
      Size baseSize = base.ArrangeOverride(arrangeBounds);
      return baseSize;
    }
  }
}

请注意,TextBox实际上确实在MeasureOverride中返回了一个大小,但ScrollViewer仍然在Arrange中传递了自己的大小。

答案 2 :(得分:0)

也许你可以显示你的图表至少300x300的大小,如果你有更多的空间,可以把它做得更大。您可以使用Scrollviewer的ActualWidth和ActualHeight属性来确保这一点。

答案 3 :(得分:0)

您通常使用DockPanel并设置LastChildFill=True,如下所示:

<DockPanel LastChildFill="True">
    <ScrollViewer>
       <Button MinWidth="300" MinHeight="300"></Button>
    </ScrollViewer>
</DockPanel>