UIElement는 레이아웃, 입력 및 이벤트를 비롯한 핵심 하위 시스템을 정의합니다.
레이아웃은 WPF의 핵심 개념입니다. 대부분의 시스템에는 고정된 레이아웃 모델 집합(HTML은 세 가지 레이아웃 모델인 흐름, 절대 및 테이블을 지원함)이 있거나 레이아웃 모델이 아예 없습니다(User32는 실제로 절대 위치 지정만 지원함). WPF는 개발자 및 디자이너가 명령적 논리 대신 속성 값을 중심으로 운영될 수 있는 유연하고 확장 가능한 레이아웃 모델을 원한다는 가정에서 출발했습니다. UIElement 수준에서 레이아웃의 기본 계약이 도입되었습니다. 즉, Measure 및 Arrange가 있는 2단계 모델이 전달됩니다.
Measure는 구성 요소가 차지할 크기를 결정합니다. 최적의 위치 및 크기를 결정하기 위해 부모 요소가 자식에게 여러 번 측정을 요구할 수 있는 상황이 많기 때문에 Arrange와 별도의 단계입니다. 부모 요소가 자식 요소에게 측정을 요구한다는 사실은 WPF의 또 다른 주요 방법인 콘텐츠에 맞는 크기를 나타냅니다. WPF의 모든 컨트롤은 콘텐츠의 기본 크기에 따라 크기가 조정됩니다. 이에 따라 지역화가 훨씬 간단해지고 크기 조정에 따른 요소의 동적 레이아웃이 가능합니다. Arrange 단계로 인해 부모가 각 자식을 배치하고 최종 크기를 결정할 수 있습니다.
대개 WPF의 출력 측면, 즉 Visual 및 관련 개체에 대해 많은 시간을 할애하여 설명하지만 입력 측면에도 새로운 내용이 매우 많습니다. WPF의 입력 모델에서 가장 근본적인 변화는 입력 이벤트가 시스템을 통해 라우트되는 일관된 모델입니다.
입력은 커널 모드 장치 드라이버의 신호로 시작되며 Windows 커널 및 User32가 관련된 복잡한 프로세스를 통해 올바른 프로세스 및 스레드로 라우트됩니다. 입력에 해당하는 User32 메시지가 WPF로 라우트되면 WPF 원시 입력 메시지로 변환되고 디스패처로 전송됩니다. WPF는 원시 입력 이벤트를 여러 개의 실제 이벤트로 변환하여 "MouseEnter"와 같은 기능이 시스템의 낮은 수준에서 구현될 수 있도록 합니다. 이 경우 이러한 기능의 배달이 보장됩니다.
각 입력 이벤트는 최소한 두 개의 이벤트인 "미리 보기" 이벤트와 실제 이벤트로 변환됩니다. WPF에 있는 모든 이벤트는 요소 트리를 통해 라우트되는 개념입니다. 이벤트는 트리의 대상에서 시작하여 루트로 위로 이동할 경우에는 "버블링"된다고 하고, 루트에서 시작하여 대상으로 아래로 이동할 경우에는 "터널링"된다고 합니다. 입력 미리 보기 이벤트는 터널링되어 트리에 있는 각 요소가 이벤트를 필터링하거나 이벤트에 대한 작업을 수행할 수 있는 기회를 제공합니다. 그런 다음 일반(미리 보기 아님) 이벤트가 대상에서 루트로 위로 버블링됩니다.
이러한 터널링 단계와 버블링 단계 간의 구분으로 인해 컴포지션 영역에서 키보드 액셀러레이터 같은 기능이 일관된 방식으로 구현됩니다. User32에서는 지원하고자 하는 모든 가속기를 포함하는 단일 글로벌 테이블을 보유하여 키보드 액셀러레이터를 구현합니다(예: "새로 만들기"에 Ctrl+N 매핑). 응용 프로그램의 디스패처에서는 User32의 입력 메시지를 탐지하고 등록된 액셀러레이터와 일치하는 것이 있는지 확인하는 TranslateAccelerator를 호출합니다. WPF에서는 시스템이 완전히 "구성 가능"하기 때문에, 즉 모든 요소가 키보드 액셀러레이터를 처리하고 사용할 수 있기 때문에 이 방법이 작동하지 않습니다. 입력에 이 2단계 모델을 사용하면 구성 요소가 자체적인 "TranslateAccelerator"를 구현할 수 있습니다.
이 단계를 더욱 발전시키기 위해 UIElement는 CommandBindings라는 개념도 도입합니다. WPF 명령 시스템에서는 개발자가 명령 끝점의 측면에서 기능을 정의할 수 있습니다. 즉, ICommand를 구현하는 기능을 정의할 수 있습니다. 명령 바인딩을 통해 요소가 입력 제스처(예: Ctrl+N)와 명령(예: 새로 만들기) 사이의 매핑을 정의할 수 있습니다. 입력 제스처와 명령 정의는 모두 확장이 가능하며 사용 중에 함께 연결될 수 있습니다. 최종 사용자가 응용 프로그램 내에서 사용할 키 바인딩을 사용자 지정하는 작업 등이 간단해집니다.
항목의 이 시점에서는 WPF의 "핵심" 기능, 즉 PresentationCore 어셈블리에 구현된 기능에 초점이 맞춰집니다. WPF를 빌드할 때는 기초 부분(예: Measure 및 Arrange과의 레이아웃 계약)과 프레임워크 부분(예: Grid 같은 특정 레이아웃의 구현) 사이가 완전히 구분되는 것이 원하는 결과였습니다. 목표는 외부 개발자가 필요한 경우 자체적인 프레임워크를 만들 수 있도록 스택의 아래쪽에 확장 가능성 지점을 제공하는 것이었습니다.