이 경우 실제 폭과 실제 높이가 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으로 설정되어 있습니다(높이도 동일).이 정보를 얻으려면 어떻게 해야 할지 모르겠어요.도움이 필요하신가요?
관찰:
- 바깥쪽 캔버스 폭과 높이를 정의하는 것은 아니지만, 그렇다고 해서 문제가 해결되지는 않습니다.
- 실행 시 이 점을 알 수 있습니다.
Canvas/Grid
창문 전체 공간을 차지하기 때문에 안에 있는 모든 직사각형은ActualWidth
및ActualHeight
s - 그리드의 폭/높이가 캔버스에 바인딩되어 있지만 이 바인딩을 제거하려고 시도했지만 문제가 해결되지 않습니다.
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
'programing' 카테고리의 다른 글
WPF List View 항목을 가로 스크롤 막대처럼 가로로 반복하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
---|---|
UI 스레드에서 작업 계속 (0) | 2023.04.11 |
Swift에서 수학적인 PI 상수를 얻는 방법 (0) | 2023.04.11 |
SQL Azure 데이터베이스를 로컬 개발 서버에 복사하려면 어떻게 해야 합니까? (0) | 2023.04.06 |
SELECT * [columnA 제외] FROM 테이블을 사용하여 열을 제외하시겠습니까? (0) | 2023.04.06 |