Skip to content

A horizontal timeline control. The axis, stems, markers and labels are drawn with Win2D, and each entry's header and content are regular XAML elements, so they can hold any content and use data templates.

Four visual modes are available (Simple, Boxed, Icon, Neon), along with item status tracking and a set of optional sci-fi effects.

Quick start ​

xml
<dev:Roadmap Mode="Simple">
    <dev:RoadmapItem Accent="#F4623A" Content="Project started." Header="Kickoff" Label="2022" />
    <dev:RoadmapItem Accent="#F5A623" Content="First public preview." Header="Preview" Label="2023" />
    <dev:RoadmapItem Accent="#35BDE4" Content="Stable release." Header="Release" Label="2024" />
</dev:Roadmap>

The control grows to fit its content. Place it in a ScrollViewer with HorizontalScrollBarVisibility="Auto" to scroll when it is wider than the available space.

Modes ​

ModeDescription
SimpleSmall dots on a thin axis, ring end dots, plain text and large coloured labels on the opposite side.
BoxedThick axis with an arrow, larger markers, bordered boxes and labels on the opposite side.
IconLarge ring markers with a glyph, coloured stems, centred text and a label badge on the same side.
NeonGlowing axis, stems and markers, translucent panels with corner brackets, scanlines, grid and axis flow.

Default metrics per mode (all can be overridden with the sizing properties):

ModeItemWidthMarkerSizeAxisThicknessStemLengthAxis caps (start / end)
Simple150142.596Dot / Dot
Boxed17022572None / Arrow
Icon15064244Dot / Arrow
Neon17020272Dot / Arrow

Roadmap properties ​

Layout ​

PropertyTypeDefaultDescription
ModeRoadmapModeSimpleVisual mode.
FirstItemPlacementRoadmapPlacementAutoSide of the axis for the first item. Auto means above.
AlternatePlacementbooltrueAlternate items above and below the axis.
DistributionRoadmapDistributionEvenEven spaces items equally. Proportional positions them by RoadmapItem.Value.
ItemWidthdoubleNaNWidth of an item. NaN uses the mode default.
MarkerSizedoubleNaNDiameter of the axis marker.
AxisThicknessdoubleNaNAxis line thickness.
StemLengthdoubleNaNDistance from the axis to the item content.
StartCap / EndCapRoadmapAxisCapAutoAuto, None, Dot or Arrow.

Appearance ​

PropertyTypeDescription
AxisBrushBrushAxis colour.
StemBrushBrushStem colour (Simple and Boxed).
MarkerFillBrushFill used for hollow markers and badges.
ForegroundBrushLabel colour in Boxed mode and the base colour of scanlines and grid.
LabelFontSizedoubleLabel size. NaN uses the mode default.
LabelFontWeightFontWeightLabel weight. Defaults to Bold.
IconFontFamilyFontFamilyFont used for Glyph. Defaults to the Fluent symbol font.

Lanes ​

PropertyTypeDefaultDescription
LanesObservableCollection<RoadmapLane>emptyRows of chips shown beneath the axis.
LaneHeaderWidthdouble120Header width shared by all lanes that do not set their own HeaderWidth.
LanesMarginThickness0,24,0,0Margin around the lanes.

Effects ​

Each toggle accepts Auto, On or Off. Auto resolves from the current mode.

PropertyTypeAuto resolves toDescription
GlowRadiusdouble6 in Neon, otherwise 0Blur radius of the glow. 0 disables it. Works in every mode.
ScanlinesRoadmapToggleOn in NeonFaint horizontal lines over the background.
GridBackdropRoadmapToggleOn in NeonFaint grid behind the axis.
AxisFlowRoadmapToggleOn in NeonLight packets travelling along the completed part of the axis.
ScanBeamRoadmapToggleOffA vertical beam sweeping across the control.
FlickerRoadmapToggleOffHologram-style brightness flicker.
BootAnimationRoadmapToggleOffDraws the axis from left to right on load and fades items in.
BootDurationdouble1.6Length of the boot animation in seconds.
AnimateActivebooltruePulse ring on the marker of an active item.

Animations run on a timer only while at least one animated effect is active and the control is loaded.

Methods ​

MethodDescription
PlayBootAnimation()Replays the boot animation.

RoadmapItem properties ​

RoadmapItem is a ContentControl. Content is shown under the Header.

PropertyTypeDefaultDescription
HeaderobjectnullHeading shown above the content.
HeaderTemplateDataTemplatenullTemplate for the header.
HeaderFontSizedouble16Header size.
HeaderForegroundBrushthemeHeader colour.
LabelstringemptyText drawn on the opposite side of the axis (Simple, Boxed, Neon) or in the end badge (Icon).
GlyphstringemptyIcon-font glyph drawn inside the marker (Icon mode).
AccentBrushtheme accentColour of the marker, stem, end dot and label.
PlacementRoadmapPlacementAutoForces the item above or below the axis.
StatusRoadmapItemStatusCompletedCompleted, Active or Planned.
ValuedoubleNaNPosition on a numeric scale when Distribution is Proportional.

Status ​

StatusAppearance
CompletedNormal rendering.
ActivePulse ring on the marker. The axis is solid up to this item.
PlannedDimmed text, hollow marker and dashed stem. The axis is dashed from the first planned item onwards when no item is active.

Proportional distribution ​

With Distribution="Proportional", items are placed according to Value between the smallest and largest value. The control widens itself so items on the same side never overlap, so closely spaced values produce a wider timeline instead of colliding content. Items without a Value fall back to even spacing.

Lanes and segments ​

A RoadmapLane is a labelled row of RoadmapSegment chips. Set Tone to Neutral, Accent, Success, Caution or Critical.

xml
<dev:Roadmap.Lanes>
    <dev:RoadmapLane Header="Stable channel">
        <dev:RoadmapSegment Content="Feature" Tone="Success" />
        <dev:RoadmapSegment Content="Preview" Tone="Caution" />
    </dev:RoadmapLane>
</dev:Roadmap.Lanes>
PropertyTypeDescription
RoadmapLane.HeaderobjectLane title.
RoadmapLane.HeaderWidthdoubleHeader width. Overrides Roadmap.LaneHeaderWidth.
RoadmapSegment.ToneRoadmapSegmentToneChip colour.

Neon example ​

xml
<Border Padding="24" Background="#0B1020" RequestedTheme="Dark">
    <dev:Roadmap BootAnimation="On" Flicker="On" Mode="Neon" ScanBeam="On">
        <dev:RoadmapItem Accent="#00E5FF" Content="Station complete." Header="Assembly" Label="T-120" Status="Completed" />
        <dev:RoadmapItem Accent="#FF4081" Content="Seven-month burn." Header="Transit" Label="T+7 mo" Status="Active" />
        <dev:RoadmapItem Accent="#69F0AE" Content="Descent and touchdown." Header="Landing" Label="T+8 mo" Status="Planned" />
    </dev:Roadmap>
</Border>

Theming ​

Default colours come from theme resources defined in Themes/Roadmap.xaml and can be overridden in your own resource dictionaries.

ResourceUsed for
RoadmapForegroundBrushRoadmap foreground.
RoadmapAxisBrush, RoadmapStemBrushAxis and stems.
RoadmapMarkerFillBrushHollow marker and badge fill.
RoadmapAccentBrushDefault item accent.
RoadmapItemForeground, RoadmapItemHeaderForegroundItem text.
RoadmapItemBackground, RoadmapItemBorderBrushBoxed item card.
RoadmapLaneForegroundLane header text.
RoadmapSegmentBackground, RoadmapSegmentForegroundNeutral segment.
RoadmapSegmentToneForegroundText on toned segments.
RoadmapSegment{Accent,Success,Caution,Critical}BackgroundSegment tones.

All resources have a high-contrast variant.

NOTE

  • Labels, markers and stems are drawn by Win2D and are not exposed to UI Automation. Header and Content are regular XAML and remain accessible, so put important information there.
  • In Neon mode, place the control on a dark background for the best result. Set RequestedTheme="Dark" on a parent so text uses light theme colours.
  • The Win2D layer reads colours from brushes. For gradient brushes it uses the first gradient stop, and for acrylic brushes it uses the fallback colour.

RoadmapRoadmapRoadmapRoadmap

Demo ​

you can run demo and see this feature.

Released under the MIT License.