programing

이 경우 실제 폭과 실제 높이가 0.0인 이유는 무엇입니까?

mailnote 2023. 4. 11. 22:18
반응형

이 경우 실제 폭과 실제 높이가 0.0인 이유는 무엇입니까?

나는 가지고 있다Grid내부Canvas다음과 같이 정의됩니다.

<Canvas x:Name="outerCanvas">
    <Grid Grid.Row="1" Name="cGrid" ShowGridLines="True" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}" Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition  />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Rectangle Name="rectangle1" Stroke="Black" Fill="AntiqueWhite" />
        <Rectangle Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle2" Stroke="Black" Fill="AliceBlue" />
        <Rectangle Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle3" Stroke="Black" Fill="Aqua" />
        <Rectangle Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="1" Name="rectangle4" Stroke="Black" Fill="DarkViolet" />
    </Grid>
</Canvas>

문제는 윈도우 컨스트럭터에서InitializeComponents()어느 하나Grid.ColumnDefinitions[0].ActualWidth또는 "모든 직사각형"입니다.ActualWidth모두 0.0으로 설정되어 있습니다(높이도 동일).이 정보를 얻으려면 어떻게 해야 할지 모르겠어요.도움이 필요하신가요?

관찰:

  1. 바깥쪽 캔버스 폭과 높이를 정의하는 것은 아니지만, 그렇다고 해서 문제가 해결되지는 않습니다.
  2. 실행 시 이 점을 알 수 있습니다.Canvas/Grid창문 전체 공간을 차지하기 때문에 안에 있는 모든 직사각형은ActualWidthActualHeights
  3. 그리드의 폭/높이가 캔버스에 바인딩되어 있지만 이 바인딩을 제거하려고 시도했지만 문제가 해결되지 않습니다.

ActualHeight그리고.ActualWidth컨트롤이 측정 및 배열될 때까지 설정되지 않습니다.보통 에는 아무것도 없습니다.InitializeComponent()이 값은 측정값을 발생시키므로 반환 시점이 됩니다.

윈도우를 호출하는 것만으로 이것들을 강제로 더 빨리 계산할 수 있습니다.Measure()그리고.Arrange()창 뒤에 수동으로 메서드 설정InitializeComponent()돌아온다.

콘텐츠에 맞게 사이징하는 경우:

window.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height));

명시적 창 크기를 사용하는 경우:

window.Measure(new Size(Width, Height));
window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height));

이는 측정 및 배열 패스가 아직 실행되지 않았기 때문이라는 Ray의 설명(+1)이 정확합니다.단, 다른 레이아웃 패스를 강제로 실행하는 대신 컨트롤이 로드될 때까지 기다렸다가ActualXxx속성:

public MyWindow()
{
    Loaded += delegate
    {
        // access ActualWidth and ActualHeight here
    };

}

이 경우 모든 사람이 로드 완료 후 실제 폭과 실제 하이트를 호출해야 한다고 했으므로 디스패처에 코드를 포장하고 다음과 같이 우선순위를 Loaded로 설정했습니다.

Dispatcher.Invoke(new Action(() =>
{
   graphHeight = ActualHeight;
   graphWidth = ActualWidth;
}), DispatcherPriority.Loaded);

언급URL : https://stackoverflow.com/questions/1695101/why-are-actualwidth-and-actualheight-0-0-in-this-case

반응형