Projekt

Allgemein

Profil

Aktionen

Fehler #87

geschlossen
JH

Pulszonen-Torte im Trainingsdetail: Prozentbeschriftung an den Tortenstücken oben/unten abgeschnitten

Fehler #87: Pulszonen-Torte im Trainingsdetail: Prozentbeschriftung an den Tortenstücken oben/unten abgeschnitten

Von Julius Haman vor 5 Tagen hinzugefügt. Vor 5 Tagen aktualisiert.

Status:
Erledigt
Priorität:
Normal
Zugewiesen an:
-
Zielversion:
Beginn:
Abgabedatum:
% erledigt:

0%

Geschätzter Aufwand:
Gefunden in Version:

Beschreibung

Ausgangslage

In der Trainingsdetail-Seite zeigt die Karte "Pulszonen" das OxyPlot-Kreisdiagramm
(300 × 230 px, TrainingDetailView.xaml, oxy:PlotView → ZonePieModel) mit der
Zonenlegende rechts daneben.

An den Tortenstücken stehen Prozentwerte außen mit Fehlerlinie (Tick).
Bei den Segmenten oben (12 Uhr) und unten (6 Uhr) ist der Text oben bzw. unten
angeschnitten und nicht vollständig lesbar; auch seitlich steht der Text dicht am Rand.

Ursache

  • OxyPlot 2.2.0 PieSeries belegt OutsideLabelFormat im Konstruktor mit
    "{2:0} %" (Vorgabe, nicht null). Der Code setzt diese Eigenschaft nirgends -
    die Außenbeschriftung entsteht also implizit und wurde so nie geplant.
  • InsideLabelFormat = string.Empty (TrainingDetailViewModel, BuildZonePie) betrifft
    ausschließlich Text in den Segmenten und ist für das Problem ohne Bedeutung
    (leerer String statt null lässt OxyPlot pro Segment trotzdem Text ausgeben).
  • OxyPlot berechnet den Radius als min(PlotArea.Breite, PlotArea.Höhe) / 2, die Torte
    füllt den Plotbereich also randlos - im OxyPlot-Quellcode steht dazu
    // todo: reduce available size due to the labels. Tick (6 px radial + 8 px horizontal)
    und Text liegen damit außerhalb des sichtbaren Bereichs und werden vom festen
    300 × 230-PlotView abgeschnitten.

Betroffene Stelle: ErControl.Core/ViewModels/TrainingDetailViewModel.cs, Methode BuildZonePie
(new PieSeries { InsideLabelFormat = string.Empty, TrackerFormatString = ... }).

Lösungsvorschlag (umgesetzt)

  1. Radius der Torte verkleinern: PieSeries.Diameter = 0.9 (vorher 1,0, OxyPlot-Vorgabe),
    damit oben und unten Luft für Tick + Text bleibt. PlotView-Größe und Layout (Karte neben
    der Legende) bleiben unverändert.
    • Gemessen (echter WPF-Renderer, 300 × 230 px): PlotArea 8,0 … 221,6 / 8,0 … 292,0 →
      Ø Torte bei 0,9 = 190,8 px, Label-Rand oben/unten je 8-9 px.
    • Diameter 1,0 (vorher): nur 2 px Rand → Text oben/unten abgeschnitten.
    • Die ursprünglich geschätzten "25-30 px Luft" waren zu groß; für Tick (6 px) +
      Text (~8 px) reichen die gemessenen 8-9 px, solange kein Label über die
      PlotArea-Grenze hinausragt.
  2. OutsideLabelFormat explizit auf "{2:0} %" setzen statt auf die OxyPlot-Vorgabe zu
    verlassen, InsideLabelFormat = null statt leerem String.
  3. %-Format Torte ("{2:0} %", ganzzahlig) vs. Legende ({percent:P1}, eine Nachkommastelle):
    bewusst so belassen - abgestimmt und in Ordnung.

Alternative (Außenbeschriftung komplett abschalten, nur Legende): entschieden, nicht
umgesetzt
- die Prozentwerte sollen weiterhin an der Torte stehen, nur eben bewusst
konfiguriert statt durch den OxyPlot-Zufall.

Umsetzung

  • Commit 4c3ade6 - "#87 fix(trainingdetail): Prozentwerte an der Pulszonen-Torte nicht
    mehr abgeschnitten" (nur TrainingDetailViewModel.cs + PulseZonePieSlice.cs).
  • dotnet build ErControl.slnx = 0 Fehler, dotnet test ErControl.Core.Tests = 122/122 grün.
  • Layoutprüfung mit dem echten WPF-Renderer (offscreen PlotView → RenderTargetBitmap),
    Kantenabstände der Beschriftung in px (schlimmster Fall = Segment exakt um 12/6 Uhr):
Fall Diameter 1,0 (vorher) Diameter 0,9 (umgesetzt)
50/50 (12 + 6 Uhr) oben 2 / unten 2 → abgeschnitten oben 9 / unten 8
5 Zonen oben 2 / unten 3 → abgeschnitten oben 9 / unten 13
1 %-Segment links 2 → abgeschnitten links 10
100 %-Segment links 2 → abgeschnitten links 5
Dark-Skin wie hell wie hell (identisch)
  • PlotArea ist im WPF-Pfad bereits symmetrisch (Torte mittig, Mitte y ≈ 114,8) - kein
    zusätzlicher Eingriff nötig. Die zuvor vermutete Asymmetrie war ein Artefakt des
    ImageSharp-Testharness, der für den leeren Titel ~55 px reserviert; der WPF-Renderer
    liefert bei Title = null OxySize.Empty.

Abnahmekriterien

  • Alle Prozentwerte an den Tortenstücken sind vollständig sichtbar, auch bei den
    Segmenten oben und unten und bei einem 100 %-Segment.
  • Kein Abschneiden bei sehr kleinen Anteilen (z. B. 1-2 %).
  • Klick-Tracker (Zone: Wert (x,x %)) und die Legende bleiben unverändert.
  • Keine Layoutänderung an der Karte (300 × 230 px) und an der Trainingsdetailseite.
  • Im Hell- und im Dark-Skin geprüft (Textfarbe folgt PlotModel.TextColor).
Aktionen

Auch abrufbar als: PDF Atom