| name | devexpress-blazor-charts |
| description | Generate and configure DevExpress Blazor Charts (DxChart, DxPieChart, DxPolarChart) for common chart types (line/bar/area/pie/donut/scatter/bubble/financial), data binding, axes, series, labels, tooltips, legends, annotations, zoom/pan, palettes, selection, and export/print. Also use for Blazor charts, data visualization, dashboards, and chart feature comparisons or migration scenarios. |
| compatibility | Requires .NET 8+. NuGet package DevExpress.Blazor is available on NuGet.org. Chart components require an interactive render mode (InteractiveServer, InteractiveWebAssembly, or InteractiveAuto) except for static image display. |
| metadata | {"author":"DevExpress","version":"26.1","source-commit":"8493730c9e9a47a009fc307a37c307e157663819"} |
DevExpress Blazor Charts
DevExpress Blazor Charts (DxChart, DxPieChart, DxPolarChart) transform data into concise visual representations with 20+ series types, customizable axes, descriptive elements, zoom/pan, and export. All three chart components share a common set of descriptive element components (DxChartTitle, DxChartLegend, DxChartSeriesLabel).
When to Use This Skill
- Add a line, bar, area, scatter, bubble, or financial chart to a Blazor page
- Create a pie or donut chart with per-sector labels and colors
- Display data in polar coordinates (spider/wind rose charts)
- Bind a chart to a C# collection, async service, or observable collection
- Configure axes: titles, strips, constant lines, scale breaks, axis ranges
- Add series labels, tooltips, legend, annotations, titles/subtitles
- Apply a custom color palette to series or pie sectors
- Enable zoom/pan with mouse wheel, touch gestures, or drag-to-zoom
- Export chart content to PNG, PDF, JPEG, or GIF
- Handle user interaction: point/series click, selection, hover events
Prerequisites & Installation
NuGet Package
| Package | Purpose |
|---|
DevExpress.Blazor | All chart components (DxChart, DxPieChart, DxPolarChart) |
dotnet add package DevExpress.Blazor
Register in Program.cs:
builder.Services.AddDevExpressBlazor();
v26.1 note: DevExpress.Blazor no longer includes options.BootstrapVersion or DevExpress.Blazor.BootstrapVersion. Do not generate either API.
Add to _Imports.razor:
@using DevExpress.Blazor
Apply a theme and add client scripts in App.razor inside <head>:
@using DevExpress.Blazor
@DxResourceManager.RegisterTheme(Themes.Fluent)
@DxResourceManager.RegisterScripts()
Important: All DevExpress packages must use the same version. A valid DevExpress license is required.
Before You Start — Ask the Developer
Before generating code, ask:
- Render Mode: What is your render mode? (
InteractiveServer, InteractiveWebAssembly, InteractiveAuto, or Static/SSR — note: zoom/pan and selection require interactivity)
- Chart type:
DxChart (Cartesian), DxPieChart (pie/donut), or DxPolarChart (polar/spider)?
- Series type: Which series type? (Line, Bar, Area, Scatter, Bubble, Candlestick, Pie, etc.)
- Data source: Is your data an
IEnumerable<T> collection, async/injected service, or ObservableCollection<T>?
- Features needed: Which features? (Labels, legend, tooltips, axes config, zoom/pan, selection, export, palette, annotations)
Rule: If the chart type or series type is ambiguous, ask before generating — the component tags and properties differ significantly.
Component Overview
DxChart<T>: Cartesian chart with 20+ series types, multiple panes, multiple axes, zoom/pan
DxPieChart<T>: Pie/donut chart; one series type (DxPieChartSeries), InnerDiameter for donut
DxPolarChart<T>: Polar coordinate chart, supports spider web (UseSpiderWeb="true")
Core Pattern
@rendermode InteractiveServer
<DxChart Data="DataSource">
<DxChartLineSeries ArgumentField="@((DataPoint v) => v.Country)"
ValueField="@((DataPoint v) => v.Sales)"
Name="Sales" />
<DxChartTitle Text="Sales by Country" />
<DxChartLegend Visible="true" />
</DxChart>
@code {
IEnumerable<DataPoint> DataSource;
protected override void OnInitialized() => DataSource = GetData();
}
Documentation & Navigation Guide
Getting Started
📄 references/getting-started.md
When you need to: set up charts for the first time, install NuGet, bind to a data source, and see a complete first-chart example.
Series Types
📄 references/series-types.md
When you need to: choose a series type, understand the series tag names, configure financial/bubble/range series, combine multiple series on one plane, or switch the chart type at runtime (bar/line/area toggle button). Also load this reference when you see error RZ10001 about DxChartCommonSeries.
Data Binding
📄 references/data-binding.md
When you need to: bind synchronously or asynchronously, use ObservableCollection, bind DataTable, trigger chart updates, or use per-series data sources.
Axes & Labels
📄 references/axes-labels.md
When you need to: configure argument/value axes, add axis titles, strips, constant lines, scale ranges, rotate axes, or configure series/axis labels.
Descriptive Elements & Customization
📄 references/customization.md
When you need to: add legend, titles, subtitles, tooltips, annotations, apply a custom palette, customize fonts, or style inner components.
User Interaction & Zoom
📄 references/interaction.md
When you need to: enable zoom/pan, drag-to-zoom, scroll bar, handle click/selection/hover events, or select series/points in code.
Quick Start Example
@rendermode InteractiveServer
@using DevExpress.Blazor
<DxChart Data="DataSource">
<DxChartBarSeries ArgumentField="@((DataPoint v) => v.Country)"
ValueField="@((DataPoint v) => v.AppleProduction)"
Name="Apples">
<DxChartSeriesLabel Visible="true" />
</DxChartBarSeries>
<DxChartBarSeries ArgumentField="@((DataPoint v) => v.Country)"
ValueField="@((DataPoint v) => v.GrapeProduction)"
Name="Grapes">
<DxChartSeriesLabel Visible="true" />
</DxChartBarSeries>
<DxChartTitle Text="Fruit Production by Country" />
<DxChartLegend Position="RelativePosition.Outside"
HorizontalAlignment="HorizontalAlignment.Right" />
</DxChart>
@code {
IEnumerable<DataPoint> DataSource;
protected override void OnInitialized() {
DataSource = new List<DataPoint> {
new DataPoint("USA", 4.21, 6.22),
new DataPoint("China", 3.33, 8.65),
new DataPoint("Turkey", 2.6, 4.25),
};
}
record DataPoint(string Country, double AppleProduction, double GrapeProduction);
}
See examples/quickstart.razor for the complete file.
Key Properties & API Surface
DxChart / DxPieChart / DxPolarChart (shared)
| Property / Method | Type | Description |
|---|
Data | IEnumerable<T> | The chart's data source |
Palette | string[] | Custom color palette for series/sectors |
PaletteExtensionMode | ChartPaletteExtensionMode | How palette is extended when colors run out (Alternate, Blend, Extrapolate) |
LabelOverlap | ChartLabelOverlap / PieChartLabelOverlap | How overlapping labels are handled (Hide, Stack, etc.) |
PointSelectionMode | ChartSelectionMode | Point selection mode (None, Single, Multiple) |
SeriesSelectionMode | ChartSelectionMode | Series selection mode |
ExportAsync(ChartExportFormat format) | Task<string> | Export chart to base64-encoded string in the specified format |
DxChart-specific
| Property | Type | Description |
|---|
Rotated | bool | Swap argument/value axes |
VisualRangeChanged | event | Fires when zoom/pan changes axis range |
ResetVisualRange() | — | Reset zoom to default |
SetArgumentAxisVisualRange() | — | Set visible range programmatically |
Series (DxChartLineSeries, DxChartBarSeries, etc.)
| Property | Type | Description |
|---|
ArgumentField | lambda | Maps data item to argument axis value |
ValueField | lambda | Maps data item to value axis value |
Name | string | Series name (shown in legend) |
Data | IEnumerable<T> | Per-series data source override |
Filter | lambda | Filter data items for this series |
Color | Color | Override series color |
Stack | string | Groups stacked bar series by name |
DxPieChart-specific
| Property | Type | Description |
|---|
InnerDiameter | double | > 0 creates a donut chart |
Common Patterns
Pattern 1: Pie / Donut Chart
@rendermode InteractiveServer
<DxPieChart Data="DataSource"
InnerDiameter="0.4"
LabelOverlap="PieChartLabelOverlap.Hide">
<DxPieChartSeries ArgumentField="@((DataPoint v) => v.Country)"
ValueField="@((DataPoint v) => v.AppleProduction)"
Name="Apples">
<DxChartSeriesLabel Visible="true" />
</DxPieChartSeries>
<DxChartTitle Text="Apple Production" />
<DxChartLegend Visible="true" />
</DxPieChart>
Pattern 2: Zoom and Pan
<DxChart Data="DataSource">
<DxChartLineSeries ArgumentField="@((DataPoint v) => v.Date)"
ValueField="@((DataPoint v) => v.Value)" />
<DxChartZoomAndPanSettings ArgumentAxisZoomAndPanMode="ChartAxisZoomAndPanMode.Both"
AllowMouseWheel="true"
AllowDragToZoom="true" />
<DxChartScrollBarSettings ArgumentAxisScrollBarVisible="true"
ArgumentAxisScrollBarPosition="ChartScrollBarPosition.Bottom" />
</DxChart>
Pattern 3: Point Selection with Event Handler
<DxChart Data="DataSource"
PointSelectionMode="ChartSelectionMode.Single">
<DxChartBarSeries ArgumentField="@((DataPoint v) => v.Country)"
ValueField="@((DataPoint v) => v.Sales)" />
</DxChart>
Troubleshooting
| Symptom | Cause | Solution |
|---|
| Chart displays as static image, no interaction | Missing or wrong render mode | Add @rendermode InteractiveServer (or WASM/Auto) to the page/component |
| Labels overlap or disappear | Many data points close together | Set LabelOverlap="ChartLabelOverlap.Hide" on DxChart |
| "The component parameter 'Data' cannot be null" at runtime | Data not initialized before render | Populate DataSource in OnInitialized(), not in OnAfterRender() |
| Pie/Polar chart shows wrong colors | Palette exhausted | Set PaletteExtensionMode to Alternate or Blend |
ExportAsync() returns empty/null | Called before chart renders | Call from OnAfterRenderAsync(firstRender: true) |
| Generic type inference error | Missing type params on series | Use lambda syntax: ArgumentField="@((MyType v) => v.Prop)" |
| Multiple series show overlapped bars | Stack grouping missing | Set Stack property on DxChartStackedBarSeries to separate groups |
"Unhandled exception on the current circuit" with no detail | CircuitOptions.DetailedErrors not set | Add builder.Services.Configure<CircuitOptions>(o => o.DetailedErrors = true); in Program.cs (development only) |
"Component parameter 'ValueChanged' is used two or more times" compile error | @bind-Value and ValueChanged used together | Use @bind-Value="@val" for two-way binding, or Value="@val" ValueChanged="@handler" — never both simultaneously |
dx-blazor.js not found (404) behind a reverse proxy | Reverse proxy strips the app base path | Add app.UsePathBase("/subpath") before app.MapBlazorHub(), or set <base href="/subpath/" /> in App.razor |
Static assets return 404 (dx-blazor.css, dx-blazor.js) | UseStaticWebAssets() not called | Add app.UseStaticWebAssets(); in Program.cs before app.UseStaticFiles() |
"Could not find 'X' in 'window.DxBlazor'" JavaScript error | Stale browser-cached JS from an older DevExpress version | Hard-refresh the browser (Ctrl+Shift+R), clear site data, or verify all DevExpress NuGet packages are the same version |
"Cannot pass the parameter 'X' to component 'Y' with rendermode" | Non-serializable parameter passed across a render mode boundary | Move the component to a child .razor file with its own @rendermode directive; pass only serializable parameters |
Constraints & Rules
CRITICAL — follow these rules in every interaction:
- Never invent API: If a property, method, event, or feature is not documented in this skill or its references, do not assume it exists. When asked about an unfamiliar API, first try to verify it using the DevExpress documentation MCP (
devexpress_docs_search) or the local apidoc/ folder. Only after checking: if confirmed, use the API; if not found, explicitly state that it does not appear to be part of the DevExpress Blazor Charts API. Do not warn that a feature "may have been introduced in a recent version" as a way to justify inventing it.
- Build verification: Run
dotnet build after changes. Check for errors before reporting success.
- NuGet packages: Use exact package names from Prerequisites. Never guess.
- Namespace imports: Always include
@using DevExpress.Blazor in your Razor files.
- Version consistency: All DevExpress packages in the project must use the same version.
- License: DevExpress requires a valid license. Remind the developer if they encounter license-related build errors.
- No destructive changes: Preserve existing code structure. Only add/modify what is necessary.
- Interactivity:
DxChart supports static render mode for display only. For zoom/pan, selection, and tooltips, the component must be in an interactive render mode.
- Generic components:
DxChart, DxPieChart, and DxPolarChart are generic (DxChart<T>). The type is inferred from the Data property or series lambda expressions. If inference fails, specify T="MyType" on the component tag.
- DxChartSeriesLabel: Use
ValueFormat (a ChartElementFormat value) for label formatting — not the obsolete Format property (lambda). Example: <DxChartSeriesLabel Visible="true" /> with no format, or configure via <DxChartAxisLabel> on the axis.
Using DevExpress Documentation MCP
If the DxDocs MCP server is available, use it to supplement this skill:
- Search:
devexpress_docs_search(technology="Blazor", query="<your question>")
- Fetch:
devexpress_docs_get_content(url="<documentation URL>")
Use MCP for: exact method signatures, event argument types, uncommon series properties, version-specific changes, or features not covered in the references above.