2012-12-20 3 views
0

일부 이미지가 포함 된 캔버스가 있으며, DrawGeometry를 사용하여 시간이 경과하면 채우는 원을 그립니다.WPF DrawingContext가 내 객체 뒤에 그려집니다.

이 내가 내 DrawingContext에서 원 그리기 방법은 다음과 같습니다

protected override void OnRender(DrawingContext drawingContext) 
{ 
    base.OnRender(drawingContext); 
    MyUtils.RenderProgressClock(drawingContext, clockPosition, 50, gameTime/totalTime); 
} 

그리고)합니다 (InvalidateVisual를 호출을; 그것을 부르는 것.

하지만이 내 서클은 내 이미지 뒤에 있으며 볼 수 없습니다. 어떻게 그 이미지를 그 앞으로 가져갈 수 있습니까?

임 완전히 WPF에 새와는 .... 나에게 힘든 시간을 제공

이 요청에 따라 다른 방법 코드입니다 : 내가 조금 더 잘 이해하는 것이 지금

private static PathGeometry GetClockGeometry(Point position, double percentage, double radius) 
     { 
      const double innerFactor = 0.90; 
      double innerRadius = radius * innerFactor; 

      PathGeometry pie = new PathGeometry(); 

      PathFigure pathFigure = new PathFigure(); 
      pathFigure.StartPoint = new Point(0, -innerRadius); 
      pathFigure.IsClosed = true; 

      if (percentage > kMaxClockPercentage) 
      { 
       percentage = kMaxClockPercentage; 
      } 
      double angle = 360.0 * percentage; 

      // Starting Point 
      LineSegment inOutLine = new LineSegment(new Point(0, -radius), true); 

      // Arc 
      ArcSegment outerArc = new ArcSegment(); 

      outerArc.IsLargeArc = angle >= 180.0; 
      outerArc.Point = new Point(Math.Cos((angle - 90) * Math.PI/180.0) * radius, Math.Sin((angle - 90) * Math.PI/180.0) * radius); 
      outerArc.Size = new Size(radius, radius); 
      outerArc.SweepDirection = SweepDirection.Clockwise; 

      LineSegment outInLine = new LineSegment(new Point(outerArc.Point.X * innerFactor, outerArc.Point.Y * innerFactor), true); 

      ArcSegment innerArc = new ArcSegment(); 
      innerArc.IsLargeArc = angle >= 180.0; 
      innerArc.Point = pathFigure.StartPoint; 
      innerArc.Size = new Size(innerRadius, innerRadius); 
      innerArc.SweepDirection = SweepDirection.Counterclockwise; 

      pathFigure.Segments.Add(inOutLine); 
      pathFigure.Segments.Add(outerArc); 
      pathFigure.Segments.Add(outInLine); 
      pathFigure.Segments.Add(innerArc); 

      pie.Transform = new TranslateTransform(position.X, position.Y); 
      pie.Figures.Add(pathFigure); 

      return pie; 
     } 

답변

1

확인을 무엇 계속 진행 중입니다. 초기 답변이 직접 작동하지 않습니다. 그러나, 나는 또한 당신이 약간의 문제가 있음을 압니다.

OnRender 작동 방식의 일반적인 특성은 그리는 것 이미지가 창에 추가하는 이미지 및 기타 등 뒤에서 항상 끝나게된다는 것을 의미합니다.

이 기능을 추가하면 특정 기능 (진행 시계)에 대한 모든 그리기 코드를 창 자체에 넣을 수 있으며이 솔루션은 다소 느껴집니다.

몇 가지 대안을 찾아 볼 수 있습니다.

간단한 것은 Clock을 그리는 UserControl을 만드는 것입니다. 그 UserControl은 채워야하는 %에 대한 DependencyProperty를 가질 수 있습니다. UserControl에서 (대략) 동일한 OnRender 코드를 사용할 수도 있고 다른 멋진 방법으로도 사용할 수 있습니다 (모든 XAML에서이를 수행 할 수있는 방법이있을 것입니다. 그러나 머리 꼭대기에서 알지 못합니다.)). 그런 다음 시계를 다른 모든 이미지/컨트롤과 마찬가지로 창에 넣기 만하면됩니다.

CustomControl을 만들 수도 있지만 WPF 및 리소스와 그 밖의 기능에 대한 지식이 조금 더 필요합니다. WPF에 익숙하지 않으므로 지금은 좀 더 익숙 할 것입니다.

+0

여기서 [_TimeLayer]는 [Panel.ZIndex] (http://msdn.microsoft.com/en-us/library/system.windows.)를 설정하지 않는 한 * 위에 '* _ImageLayer'가 선언되어야합니다. controls.panel.zindex (v = vs.110) .aspx). – Clemens

+0

오버 라이드 된 OnRender의 경우 상위 컨트롤은 캔버스 일 필요는 없습니다. 간단한 UIElement 일 수 있습니다. – Clemens

+0

그래, 나는 그걸 뒤로했다. 너무 빨리하는 것. 감사 Clemens – Tim

1

원을 캔버스에 추가하는 방법을 보여 주어야합니다.

WPF는 유지 된 그리기 시스템이므로 시각적 트리의 컨트롤이 시각적 트리에 나타나는 순서는 스태킹 순서를 지정합니다. OnRender()은 실제로 그릴 수 없으므로 AccumulateDrawingObjects()을 의미합니다. 그리면 그냥 그릴 개체 집합을 만듭니다.

또한 개체가 동일한 크기를 유지하는 경우 매우 비싼 다시 레이아웃이 발생하기 때문에 InvalidateVisual()이 필요하지 않습니다. 다시 렌더링 할

더 효율적인 방법은 AffectsRender으로하는 DependencyProperty를 사용하는 ... 아니면 DrawingGroup을 만들려면 DrawingContext 동안 OnRender()에 추가 한 후 언제든지 나중에 DrawingGroup.Open()DrawingGroup의 드로잉 명령을 변경할 수 있습니다.

+0

좋습니다. 이것은 정말 오래된 질문입니다. 왜 내가이 하하를하고 있었는지 기억이 안납니다. –