2

パネルを拡張して単純な 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>
4

1 に答える 1