컨트롤을 기본 요소로 분할하고 레이아웃 관리를 수행하고 바인딩을 적용하는 등 일반적인 WPF 렌더링을 납치하고 싶습니다.사용자 정의 DrawingContext로 렌더링
필자가 이해하는 한, WPF의 전체 렌더링은 레이아웃 관리자가 계산 한 위치에서 종속성 속성 시스템에 의해 정의 된 값으로 프리미티브 (텍스트, 이미지, 선, 곡선)를 렌더링하는 것으로 이어집니다. 내 자신의 프리미티브 렌더링 논리를 제공 할 수 있다면 예를 들어 렌더링 할 수있을 것입니다. 사용자 정의 문서 유형으로, 다음되는 네트워크 등
내 계획을 통해 실시간 렌더링을위한 프리미티브를 전송 :
- 사용자 정의
DrawingContext
를 구현합니다.DrawingContext
은DrawEllipse
,DrawText
,DrawImage
등의 메소드를 정의하는 추상 클래스입니다.이 기능을 구현하려면 자체 구현을 제공해야합니다. - WPF
UserControl
을 만들고이를 주어진DrawingContext
으로 렌더링하도록합니다.
그러나 나는 다음과 같은 문제가 발생했습니다 :
DrawingContext
내가 쉽게 무시할 수 없습니다 추상적 인 내부 방법void PushGuidelineY1(double coordinate)
및void PushGuidelineY2(double leadingCoordinate, double offsetToDrivenCoordinate)
가 포함되어 있습니다. (아마도 이것을 극복하기위한 트릭이 있습니까?)- 전체를에 렌더링하는 방법은 보이지 않습니다.
DrawingContext
? 왜?
나는
void RenderRecursively(UIElement e, DrawingContext ctx)
{
e.OnRender(ctx);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(e); i++)
RenderRecursively((UIElement)VisualTreeHelper.GetChild(e, i), ctx);
}
과 같은 작업을 수행 할 수 있습니다 -하지만 나는 UIElement
을 렌더링 할 수있는 직접적인 방법이 있는지 궁금합니다. (물론이 문제는 사소한 것이지만, 인프라가 없기 때문에 이것이 적절한 방법인지 궁금합니다.)
따라서 DrawingContext
은 상속을위한 것이 아닙니다. 커스텀 DrawingContext
을 올바른 방향으로 나아갈 생각인가 아니면 전략을 재고해야합니까? WPF에서 지원되는 사용자 지정 컨텍스트에 그리는가, 아니면 다른 차단 지점을 찾아야합니까?
DrawingContext의 설명에서 :'DrawingContext를 직접 인스턴스화하지 마십시오. 그러나 DrawingGroup.Open 및 DrawingVisual.RenderOpen과 같은 특정 메서드에서 드로잉 컨텍스트를 얻을 수 있습니다. "나에게 이것은 실제로 사용자 정의 DrawingContext를 어딘가에 제공 할 수있는 방법이 없다는 것을 의미합니다. – Clemens
@Clemens : 예, 저는이 말을 보았습니다. 그러나 "일반적으로 직접 작성해서는 안되며, 내부적으로 처리해야하며, DrawingVisual로 그리기 만하면 DrawingVisual에서 올바르게 초기화됩니다."라고 이해했습니다. 어쨌든 재미있는 것은 그림 그리기에 유효한 차단 점이있는 경우입니다. – Vlad
DrawingVisual에 드로잉 할 수있는 유일한 방법은 DrawingVisual.RenderOpen에서 제공하는 DrawingContext에 드로잉하는 것입니다. 사용자 지정 DrawingContext를 Visual과 연결할 수있는 방법은 없습니다. 그 아이디어는 무의미하다. – Clemens