我已经制作了自定义布局面板。我已经实现了 MeasureOverride 和 ArrangeOverride 方法。
这是我使用面板的方式。
<Window
x:Class="TestWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:TestPanel="clr-namespace:TestPanel;assembly=TestPanel"
Title="MainWindow"
Width="706"
Height="200">
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Height" Value="40" />
<Setter Property="MinWidth" Value="120" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</Window.Resources>
<ScrollViewer>
<Border BorderBrush="Red" BorderThickness="1">
<TestPanel:ShrinkPanel Background="Aqua" MaxColumns="4">
<Button Content="Text 1" />
<Button Content="Text 2" />
<Button Content="Text 3" Height="75" />
<Button Content="Text 4" />
<Button Content="Text 5" />
<Button Content="Text 6" Height="100" />
<Button Content="Text 7" />
<Button Content="Text 8" />
<Button Content="Text 9" Height="75" />
</TestPanel:ShrinkPanel>
</Border>
</ScrollViewer>
</Window>
一切正常,除了调整面板大小时不调用 MeasureOverride 。Height 属性始终为 NaN,而 ActualHeight 发生变化,但不会引起测量。
如何在调整大小时强制测量?
我已经订阅了 SizeChanged 事件并像这样调用 MeasureOverride
private void This_SizeChanged(object sender, SizeChangedEventArgs e)
{
Measure(e.NewSize);
}
但是此代码似乎并未在框架中的任何地方使用。我认为根据宽度指定最小允许高度应该是一项非常常见的任务。
那么,重新测量并因此在调整大小时设置 DesiredSize(或 MinHeight/MinWidth?!)的正确方法是什么。