WPF의 너비와 실제 폭의 차이점은 무엇입니까?
-
03-07-2019 - |
문제
나는 현재 함께 일하고 있습니다 Panel
wpf에서 s, 그리고 나는 Width
그리고 Height
속성에는 다른 두 가지 속성이 호출됩니다 ActualWidth
그리고 ActualHeight
.
ActualWidth
이 요소의 렌더링 된 너비를 가져옵니다. 이것은 종속성 속성입니다. (프레임 워크 레포먼트에서 상속.)
Width
요소의 너비를 가져 오거나 설정합니다. 이것은 종속성 속성입니다. (프레임 워크 레포먼트에서 상속.)
참조: MSDN
누구나 지적 할 수 있습니다 둘과 어느 쪽을 사용 해야하는지의 차이점?
해결책
Width
/Height
입니다 요청 또는 레이아웃 크기. 자동으로 설정하면 값은 double.NaN
뒤에 코드로 속성에 액세스 할 때.
ActualWidth
/ActualHeight
입니다 렌더링 크기. 항목의 실제 크기를 원하거나 필요한 경우이 속성을 사용하십시오.
다른 팁
나는 찾았다 ActualWidth
한 요소의 너비 또는 높이를 다른 요소에 바인딩하고 싶을 때 가장 유용합니다.
이 간단한 예제에는 나란히 배열 된 두 개의 버튼과 아래에 두 개의 버튼이 포함 된 스택 패널의 너비에 제한된 주석이 있습니다.
<StackPanel>
<StackPanel Margin="0,12,0,0" Orientation="Horizontal" Name="buttonPanel" HorizontalAlignment="Left" >
<Button Content="Yes - Arm the missile" FontWeight="Bold" HorizontalAlignment="Left"/>
<Button Content="No - Save the world" HorizontalAlignment="Left" Margin="7,0,0,0"/>
</StackPanel>
<TextBlock Text="Please choose whether you want to arm the missile and kill everybody, or save the world by deactivating the missile."
Width="{Binding Path=ActualWidth,ElementName=buttonPanel}" Margin="0,5,0,0" HorizontalAlignment="Left" TextWrapping="Wrap"/>
</StackPanel>
ActualWidth
값의 패딩을 설명하므로 언제든지 전화 할 수있는 번호를 알아야합니다. Actualwidth
너비 대신에 계산을 피하십시오.
편집 : 제거 된 마진 B/C 실제 전체의 일부가 아닙니다.
ActualWidth
렌더링 시스템에 의해 설정되며 다른 요소의 너비와 전체 크기 제약 조건에 따라 다를 수 있습니다. 결과적으로 변경할 수 없습니다. Width
변경할 수있는 속성이며 요소의 폭을 늘리거나 줄이는 데 사용해야합니다.
에서 MSDN:
이 속성은 다른 너비 입력 및 레이아웃 시스템을 기준으로 계산 된 값입니다. 값은 실제 렌더링 패스를 기반으로 레이아웃 시스템 자체에 의해 설정되므로 다음과 같은 속성의 설정 값보다 약간 뒤떨어 질 수 있습니다.
Width
이것이 입력 변경의 기초입니다.
아주 좋은 이유가 있습니다 사용하지 마십시오 ActualWidth
(분명히 ActualHeight
따라서). 당신이 설정할 때 Width
요소의 ActualWidth
당신이 할 수있는 다른 사람의 레이아웃 체인을 깨십시오.
최선의 경우 부모의 레이아웃 프로세스 (바인딩 소스)가 완료된 후 요소/제어를 구문 분석해야합니다. 그것은 추가 시간을 의미합니다. 부모와 동일한 계층 수준 인 경우 레이아웃 프로세스는 결정적인 크기를 계산하기 위해 적어도 두 개의 실행이 필요합니다.
예를 들어, 나는 그것을 TemplatedParent
(하지 마):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}"
Height="1" Fill="#000000"/>
포함 된 창을 크기를 조정할 때 컨트롤은 컨테이너가 점점 작아지고 레이아웃을 제동하지 못하게합니다. 그것을 설정합니다 Width
문제를 해결합니다 (하다):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}"
Height="1" Fill="#000000"/>
사용해야하는 경우 ActualWidth
일반적으로 XAML에 문제가 있습니다. 레이아웃 실행의 최종 크기를 엉망으로 만드는 대신 더 잘 수정하십시오.
정확히 렌더 너비! = 레이아웃 너비입니다. 하나는 레이아웃에 사용되도록 의도되어 있습니다. 다른 하나는 렌더링 용입니다. Winforms와 마찬가지로 크기와 클라이언트 크기 속성이 있었고, 약간 다르고, 렌더링의 atual/클라이언트 크기와 레이아웃의 너비/높이를 사용해야합니다.
당신은 설정할 수 있습니다 Width
재산은 아니지만 ActualWidth
재산.
그만큼 Width
속성은 패널 렌더링 방법을 결정하는 데 사용됩니다. ActualWidth
사용 된 실제 너비로 설정됩니다. 이것은 아동 요소의 크기와 부모 요소의 구성에 따라 너비와 동일하지 않을 수 있습니다.
그만큼 ActualWidth
설정할 때 즉시 설정되지 않습니다 Width
속성이지만 렌더링 중에 업데이트됩니다 (한 번 이상).