パネルを拡張して単純な ArrangeOverride として作成すると、コンテンツは左上隅ではなく中央から始まります。新しいポイント 0,0 は、私が見る限り、コンテンツを左上から開始する必要があります。この振る舞いを誰が説明できますか?
メインウィンドウをスケーリングすると、コンテンツ (テキスト) の左上隅がメインウィンドウの中央に保持されます
Public Class AvoidInfiniteSizePanel
Inherits Panel
Protected Overrides Function MeasureOverride(availableSize As Size) As Size
If Me.Children.Count = 1 Then
Dim Content = Me.Children(0)
Content.Measure(New Size(Double.MaxValue, Double.MaxValue))
Dim MyDesiredSize As Windows.Size = New Size(Math.Max(Content.DesiredSize.Width, MinimalWidth), Math.Max(Content.DesiredSize.Height, MinimalHeight))
Return MyDesiredSize
Else
Return MyBase.MeasureOverride(availableSize) 'Default gedrag
End If
End Function
Protected Overrides Function ArrangeOverride(finalSize As Size) As Size
If Me.Children.Count = 1 Then
Me.Children(0).Arrange(New Rect(New Point(0, 0), finalSize))
Else
Return MyBase.ArrangeOverride(finalSize) 'Default gedrag
End If
End Function
End Class
および XAML:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:infiniteSizeTester"
Title="MainWindow" Height="125" Width="230">
<Grid>
<local:AvoidInfiniteSizePanel>
<TextBlock VerticalAlignment="Top" HorizontalAlignment="Left" >Why is this in the center instead of at position 0,0</TextBlock >
</local:AvoidInfiniteSizePanel>
</Grid>
</Window>