控制如何说:我会占用父母给我的所有空间?
例如,我的控件位于ScrollVewer中。它用尺寸(无限,无限)测量我的控制。我的控件显示小图表。图表仍然看起来很好的最小尺寸是(300,300)。最大尺寸不受限制。我的控件应该从MeasureOverride()返回多大? (0,0)或(300,300)?
当availableSize是准确的大小时,MeasureOverride方法应该返回什么尺寸,例如(1234,1235)?
此问题与WPF和Windows 8 XAML应用程序相关。
答案 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>