Fehler #87
geschlossenPulszonen-Torte im Trainingsdetail: Prozentbeschriftung an den Tortenstücken oben/unten abgeschnitten
0%
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
PieSeriesbelegtOutsideLabelFormatim Konstruktor mit
"{2:0} %"(Vorgabe, nichtnull). 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 stattnulllä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)¶
- 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.
- Gemessen (echter WPF-Renderer, 300 × 230 px): PlotArea 8,0 … 221,6 / 8,0 … 292,0 →
OutsideLabelFormatexplizit auf"{2:0} %"setzen statt auf die OxyPlot-Vorgabe zu
verlassen,InsideLabelFormat = nullstatt leerem String.- %-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" (nurTrainingDetailViewModel.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 beiTitle = nullOxySize.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).
JH Von Julius Haman vor 5 Tagen aktualisiert
- Beschreibung aktualisiert (Vergleich)
JH Von Julius Haman vor 5 Tagen aktualisiert · Edited
- Beschreibung aktualisiert (Vergleich)
JH Von Julius Haman vor 5 Tagen aktualisiert
Ticket an den Stand der Umsetzung angepasst:
- Lösungsvorschlag an die gemessenen Werte korrigiert (Diameter 0,9 ergibt 8-9 px Label-Rand, nicht 25-30 px).
- Punkt 3 (%-Format Torte/Legende) als bewusst so entschieden markiert, Alternative verworfen.
- Abschnitt "Umsetzung" mit Commit 4c3ade6, Build/Test-Status und Messtabelle (echter WPF-Renderer, hell + dunkel, 1/100 %) ergänzt.
- PlotArea ist bereits symmetrisch; die vermutete Asymmetrie war ein Testharness-Artefakt.
- Abnahmekriterien abgehakt.
Bitte noch einmal in der App gegenprüfen, dann kann das Ticket geschlossen werden.
JH Von Julius Haman vor 5 Tagen aktualisiert
- Zielversion wurde auf ErControl 3.1.2 gesetzt
JH Von Julius Haman vor 5 Tagen aktualisiert
- Status wurde von Neu zu Erledigt geändert