0

いくつかの画像を含むキャンバスがあり、DrawGeometry も使用して、時間が経過すると塗りつぶされる円を描画します。

これは、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;
        }
4

2 に答える 2

1

OK、何が起こっているのかを少し理解できたので、私の最初の答えはあなたにとって直接的にはうまくいかないことがわかりました. ただし、少し問題があることもわかります。

OnRender が機能する方法の一般的な性質は、描画したものが常に画像やウィンドウに追加したものの背後にあることを意味します。

それに加えて、特定の機能 (プログレス クロック) のすべての描画コードをウィンドウ自体に配置しているという事実があり、このソリューションは少しずれているように感じます。

いくつかの代替案を検討することをお勧めします。

簡単な方法は、Clock を描画する UserControl を作成することです。その UserControl は、埋められるべき % の DependencyProperty を持つことができます。UserControl で (ほぼ) 同じ OnRender コードを使用するか、他のいくつかの凝った方法でそれを行うことができます (すべての XAML でそれを行う方法があると確信していますが、頭の中でそれを知りません)。 )。次に、他のすべての画像/コントロールと同様に、その時計をウィンドウに配置します。

CustomControl を作成することもできますが、それには WPF とリソース、およびそれがどのように機能するかを理解するためのその他の知識が少し必要です。あなたは WPF に慣れていないので、今は少し多すぎるかもしれません。

于 2012-12-20T19:36:55.323 に答える