Skip to main content
All docs
V25.2
  • v25.2 Release Notes

    • 12 minutes to read

    Tip

    Visit our website to explore new features/capabilities available across the entire DevExpress product line: What’s New in our Latest Version.

    .NET 10 and Visual Studio 2026 Support

    DevExpress WPF component libraries now support .NET 10 and Visual Studio 2026.

    DevExpress Template Kit

    New Item Templates

    The DevExpress Template Kit v25.2 includes over 40 item templates for WPF projects, which include:

    • Kanban View
    • Interactive Charts
    • Master-detail Data Grid Presentations
    • Pre-designed Edit Forms
    • Infrastructure for MVVM and Dependency Injection (DI)
    • Pre-configured BI Dashboards
    • Document Processing (Mail Merge, Import to Excel, Word to PDF Conversion, and more…)

    Kanban Board Item Template - DevExpress Template Kit for WPF, DevExpress

    Project Templates for JetBrains Rider

    The DevExpress Template Kit is fully integrated into JetBrains Rider. You can create new projects using the same rich set of DevExpress templates available in Visual Studio and VS Code.

    AI Chat Control Enhancements

    Resources

    Our WPF AI Chat Control can now access external data sources (such as MCP (Model Context Protocol) servers) or dynamically generated content through resources. After you assign resources the AI Chat Control displays the “Attach Context” (+) button. Users can select one or more resources to include in the chat request (plain text, PDF, image). A built-in search box helps users quickly locate desired items when the resource list is long.

    Resource - WPF AI Chat Control, DevExpress

    You can also customize resource appearance. Use the AIChatControl.ResourceItemTemplate property to supply a Razor-based template for resource items displayed in the chat’s “Attach Context” dropdown.

    using DevExpress.AIIntegration.Blazor.Chat;
    using Microsoft.AspNetCore.Components;
    
    //...
    RenderFragment<AIChatResource> ResourceTemplate;
    
    public MainWindow() {
        InitializeComponent();
        aiChatControl.ChatResources = Resources;
    
        ResourceTemplate = resource => builder => {
            builder.OpenComponent<Resource>(0);
            builder.AddAttribute(1, "resource", resource);
            builder.CloseComponent();
        };
    
        // Assign a Razor-based template.
        aiChatControl.ResourceItemTemplate = ResourceTemplate;
    }
    

    Read Tutorial: Chat Resources

    Tool Calling API

    AI Tool Calling API connects your WPF application logic with natural language input. The WPF AI Chat Control can invoke methods annotated with metadata that describes purpose, input parameters, and optional target objects.

    Tool Calling - WPF AI Chat Control, DevExpress

    Attach the AIToolsBehavior to a target control to enable AI tools defined in the specified type. The AIToolsBehavior automatically manages the lifecycle of the tool context:

    • Creates and registers the context when the control is initialized.
    • Disposes the context when the control is unloaded.
    <dxg:GridControl x:Name="gridControl">
        <dxmvvm:Interaction.Behaviors>
            <dxai:AIToolsBehavior
                ToolType="{x:Type local:GridTools}"
                TargetDescription="The grid control that displays contact information." />
        </dxmvvm:Interaction.Behaviors>
    </dxg:GridControl>
    

    A tool method must meet the following conditions to be discoverable:

    • The method must have the AIIntegrationTool attribute with a unique identifier.
    • The method must be public and static.

    Read Tutorial: AI Tool Calling Run Demo: AI Tool Calling

    Display Tool Information

    You can display information about invoked tools in chat responses. Enable the AI Chat Control’s IncludeFunctionCallInfo option to include metadata about invoked tools/functions (function names and arguments) in response messages.

    Display Tool Information - WPF AI Chat Control, DevExpress

    Read Tutorial: Display Tool Information

    Manage Multiple Chat Clients

    The DevExpress WPF AI Chat Control supports use of multiple AI services within a single application. You can place multiple AI Chat Controls on the same form (for example, to test model quality or host specialized agents) or use a single AI Chat Control and switch between AI providers at runtime.

    Manage Multiple Chat Clients in WPF AI Chat Control, DevExpress

    <dx:ThemedWindow 
        x:Class="DXWPFMultipleChatClients.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
        xmlns:dxaichat="http://schemas.devexpress.com/winfx/2008/xaml/aichat"
        Title="MainWindow" Height="800" Width="1000">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <dxaichat:AIChatControl
                x:Name="azureChat"
                ChatClientServiceKey="azureOpenAIClient"
                HorizontalAlignment="Stretch" 
                VerticalAlignment="Stretch" 
                Margin="10"/>
    
            <dxaichat:AIChatControl
                x:Name="ollamaChat"
                ChatClientServiceKey="ollamaClient"
                HorizontalAlignment="Stretch" 
                VerticalAlignment="Stretch" 
                Margin="10"
                Grid.Column="1"/>   
        </Grid>
    </dx:ThemedWindow>
    

    To switch a single AI Chat Control between AI providers at runtime, update its ChatClientServiceKey property.

    Read Tutorial: Manage Multiple Chat Clients

    Message Templates

    You can create Razor-based templates for messages and the empty chat area to customize the chat UI:

    • AIChatControl.MessageTemplate
    • AIChatControl.MessageContentTemplate
    • AIChatControl.EmptyStateTemplate

    Customize Empty Area - WPF AI Chat, DevExpress

    Read Tutorial: Customize Chat UI and Appearance

    Error Message Background

    Use the new AIChatControl.ErrorMessageBackground property to specify the background color of error messages:

    <dxaichat:AIChatControl x:Name="aiChatControl"
                    ErrorMessageBackground="LightCoral"
                    InputEnabled="True"
                    Margin="10">
    </dxaichat:AIChatControl>
    

    Error Message Background - WPF AIChatControl, DevExpress

    Header and Clear History Button

    Our WPF AI Chat Control can display a header. The header contains a customizable chat title and a “Clear Chat” button (removes all messages from the conversation history except system messages).

    To display the chat header, enable the AIChatControl.ShowHeader option. The AIChatControl.HeaderText property specifies the chat title.

    Title and Clear Chat Button - WPF AI Chat Control, DevExpress

    Resizable Prompt Box

    Enable the new AIChatControl.AllowResizeInput option to allow users resize the input area. Users can drag the top edge to enlarge the input area or down to display a more detailed chat history.

    Resize Input Area - WPF AI Chat Control, DevExpress

    Chat Project Templates — DevExpress Template Kit

    The DevExpress Template Kit includes new chat-based project templates for apps targeting .NET 8+.

    Supported AI providers:

    • Azure OpenAI
    • OpenAI
    • Ollama
    AI Chat Application
    Creates a WPF chat app that integrates the AI Chat Control. Optionally integrates the DevExpress MCP Server for DevExpress-specific technical guidance (adds an mcp.json configuration file to the application).
    AI Chat (RAG) Application

    Creates a desktop WPF application with the AI Chat Control and built-in Retrieval-Augmented Generation (RAG) for document-grounded conversations:

    • Uses local document data for context-aware answers.
    • Scans the user’s Documents folder and indexes PDF, DOCX, TXT, RTF, and HTML files.
    • Extracts, embeds, and semantically searches document text.
    • Stores vectors in In-Memory (rebuilds each run) or SQLite (persistent database).
    • Merges retrieved content with user prompts to improve accuracy.
    • Optionally integrates the DevExpress MCP Server for DevExpress-specific technical guidance.

    Chat Project Templates - WPF AI Chat Control, DevExpress

    AI-powered Extensions

    SmartPaste - AI-powered Image Processing

    v25.2 extends the SmartPaste extension to process clipboard images. Enable the ProcessClipboardImage option to extract structured data from images.

    Prompt Augmentation

    DevExpress AI Assistant and SmartPaste extensions support Prompt Augmentation. Use the AI-powered behavior’s PromptAugmentation property to supply additional instructions that modify the default prompt (for example, always translate results into English):

    <dxe:TextEdit TextWrapping="Wrap" AcceptsReturn="True" VerticalContentAlignment="Top">
        <dxmvvm:Interaction.Behaviors>
            <dxai:ChangeStyleBehavior x:Name="ChangeStyle"
                            PromptAugmentation="Always translate the result into English."/>
        </dxmvvm:Interaction.Behaviors>
    </dxe:TextEdit>
    

    Accessibility Enhancements

    Keyboard Navigation

    Filter Editor and Filter Panel

    Core WPF Data Grid functionality (including filtering, sorting, and column management) is now fully accessible using the keyboard. Users can navigate, modify, and delete filter nodes in the Grid’s Filter Panel and Filter Editor. When a filter node is focused, the screen reader announces its value and state.

    Property Name Description
    AllowFilterPanelNavigation When activated, users can navigate between the Grid’s View and the Filter Panel using the keyboard.

    Read Tutorial: Filter Panel Keyboard Actions

    Step Progress Bar

    Users can now navigate between StepProgressBar items and activate them using the keyboard.

    Keyboard Shortcut Action
    Tab Moves focus between views on a page.
    Navigates between StepProgressBar items.
    Space or Enter Activates the focused item.

    Color Editor

    Users can now navigate ColorEdit UI elements and select colors using the keyboard.

    Cycle Through Nested Ribbons

    With this updated, WPF Ribbon Controls nested within document panels are fully accessible using the keyboard. Pressing the Alt key cycles focus through all Ribbon controls in the View.

    Users can now navigate to the Ribbon Gallery and open it using the Enter key. Screen readers accurately announce gallery item information and state.

    Row and Cell Narrator Text Customization

    Our WPF Data Grid, TreeList, and TreeView controls allow you to customize narrator text for rows, cells, and nodes. You can specify the information screen readers announce when users navigate through data elements.

    You can handle the new AutomationRequested attached event to override default narrator text for focused rows or cells. This event is useful when default automation text may not fully reflect displayed content (for example, when row-based navigation is enabled or when custom row or detail templates are used).

    <dxg:GridControl ItemsSource="{Binding Items}">
        <dxg:GridControl.View>
            <dxg:TableView
                x:Name="tableView"
                NavigationStyle="Row"
                dxg:GridAutomationHelper.AutomationRequested="OnAutomationRequested"/>
        </dxg:GridControl.View>
    </dxg:GridControl>
    
    using DevExpress.Xpf.Grid;
    using DevExpress.Xpf.Grid.Automation;
    
    void OnAutomationRequested(object sender, AutomationEventArgs e) {
        if (e is RowAutomationEventArgs rowArgs) {
            var grid = rowArgs.DataControl as GridControl;
            var view = grid?.View as TableView;
            if (view == null)
                return;
    
            // Skip 'special' rows.
            if (rowArgs.RowHandle == DataControlBase.NewItemRowHandle ||
                rowArgs.RowHandle == DataControlBase.InvalidRowHandle)
                return;
    
            // "Header1 Value1, Header2 Value2, ..."
            var parts = view.VisibleColumns.Select(c => {
                var header = c.HeaderCaption ?? c.FieldName;
                var value  = view.GetCellValue(rowArgs.RowHandle, c);
                return $"{header} {value}";
            });
    
            e.AutomationValue = string.Join(", ", parts);
        }
    }
    

    Rich Text Edit — Accessibility Enhancements

    Screen Reader Support for Word Documents
    Rich Text Editor documents are now accessible to screen readers (Narrator, NVDA). You can navigate through document paragraphs, lines, words, and characters. Readers can pronounce all document sections — main text, headers, footers, text boxes, image alt text.
    Accessible Dialogs
    We improved screen reader support and keyboard navigation in Rich Text Editor dialogs. Screen readers now announce all labels and editor values in major dialogs, and users can navigate between dialog controls using the keyboard.

    TreeList — Level Announcement

    The WPF TreeList can announce the hierarchical level of the currently focused node. This enhancement allows screen reader users to better perceive the structure of hierarchical data and navigate the tree more efficiently (ensures full compliance with WCAG 2.2 Success Criterion 1.3.1).

    Data Grid Enhancements

    A new PrintWidth property allows you to specify column width (in pixels) for print and export operations. Use this property to ensure consistent column alignment across PDF, XLSX, and DOCX outputs.

    <dxg:GridControl>
        <dxg:GridControl.Columns>
            <dxg:GridColumn FieldName="Email" Header="Email Address" PrintWidth="300"/>
            <dxg:GridColumn FieldName="Name" Header="Full Name" PrintWidth="200"/>
        </dxg:GridControl.Columns>
    </dxg:GridControl>
    

    Checkbox Selector Column Positioning

    New API allows you to change the position of the checkbox selector column:

    Checkbox Selector Column Positioning - WPF Data Grid, DevExpress

    Use the following properties to configure selector column position:

    Property Name Description
    CheckBoxSelectorColumnPosition Specifies the general position of the checkbox selector column.
    CheckBoxSelectorColumnVisibleIndex Specifies the position index of the selector column within the column header area.
    <dxg:GridControl ... 
                        SelectionMode="MultipleRow">
        <dxg:GridControl.View>
            <dxg:TableView ShowCheckBoxSelectorColumn="True"
                            ShowCheckBoxSelectorInGroupRow="False"
                            CheckBoxSelectorColumnPosition="None"
                            CheckBoxSelectorColumnVisibleIndex="5"/>
        </dxg:GridControl.View>
    </dxg:GridControl>
    

    Run Demo: Web Style Row Selection

    Available Options

    Value Description
    None Checkbox selector column position is based on the CheckBoxSelectorColumnVisibleIndex property.
    Left The Checkbox selector column occupies the leftmost position within the scrollable content area. The CheckBoxSelectorColumnVisibleIndex property is ignored.
    Right The Checkbox selector column occupies the rightmost position within the scrollable content area. The CheckBoxSelectorColumnVisibleIndex property is ignored.
    FixedLeft The Checkbox selector column is fixed to the left border of the grid view. The CheckBoxSelectorColumnVisibleIndex property specifies the position index within the fixed group.
    FixedRight The Checkbox selector column is fixed to the right border of the grid view. The CheckBoxSelectorColumnVisibleIndex property specifies the position index within the fixed group.

    Note

    Users cannot change the position of the selector column via drag & drop.

    Prevent User Changes in Cell Editor

    The WPF Data Grid ships with a new CellEditorValueChanging event and allows you to intercept and cancel cell value modifications before they are applied to the UI.

    In previous versions, when users edited a cell (for example, by toggling a checkbox), the UI would immediately reflect changes, even if underlying data posting was subsequently canceled in the CellValueChanging event handler. With this update, you can prevent the cell editor value from being changed in the UI itself.

    This feature is useful for confirmation dialogs in Boolean columns. For example, you can prompt the user before changing a cell’s value, and if the action is canceled, the cell remains unchanged:

    void OnIsActiveCellEditorChanging(object sender, CellEditorValueChangingEventArgs e) {
        if (e.Column.FieldName == "IsActive") {
            var result = MessageBox.Show(
                "Would you like to change the Active status?",
                "Warning",
                MessageBoxButton.OKCancel,
                MessageBoxImage.Question,
                MessageBoxResult.OK
            );
            e.Cancel = (result == MessageBoxResult.Cancel);
        }
    }
    

    Tip

    The CellEditorValueChanging event is also available in the WPF TreeList control.

    Ribbon Control Enhancements

    Outlook-inspired Page Header Button

    Our WPF Ribbon Control can display the Page Header Button within the page header area. This button can be used to expand or collapse a navigation control, similar to behaviors found in recent versions of Microsoft Outlook.

    Outlook-inspired Page Header Button - WPF Ribbon Control, DevExpress

    To enable the Page Header Button:

    1. Set the RibbonControl.ShowPageHeaderButton property to true.
    2. Use the PageHeaderButtonCommand property to assign the associated action.

    The Page Header Button is available with the following Ribbon styles:

    • Office2019
    • OfficeSlim
    • TabletOffice

    Rich Text Editor

    Mail Merge Enhancements — Merge Data with Detail Regions

    The mail merge engine used within the DevExpress WPF Rich Text Editor supports nested regions. You can merge data with any number of hierarchical levels (master–detail–subdetail and beyond) within a single template. Existing MailMerge methods work for both single-level and multi-level documents, no additional settings/toggles required.

    Use TableStart:RegionName and TableEnd:RegionName merge fields to mark regions that contain data from a single record (master or detail). Merge regions can be defined within paragraphs or tables. Regions placed in tables automatically expand the table with source data during the merge.

    Additional Mail Merge and Field API enhancements:

    • Support for major data source types: IList, IList<T>, ArrayList, DataTable, DataSet.
    • Added options to define and process custom region tags (instead of default TableStart / TableEnd).
    • Added a new GetRegionHierarchy method to get document region hierarchy. Use it to determine parent and nested regions, obtain region names and ranges, retrieve region fields.
    • Added the IsMergeField flag determining Merge Fields.
    • Introduced the MergeField interface to obtain merge field name and settings.
    • Enhanced mail merge-related events with region information arguments.

    The following code snippet merges data and handles the MailMergeRecordStarted event to log the merge process:

    // Read JSON data to a database object
    string dataPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "nwind_data.json");
    string json = File.ReadAllText(dataPath);
    NWind? nwind;
    nwind = JsonSerializer.Deserialize<NWind>(json);
    
    // Load the template into the RichEditControl instance.
    var templatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "template.docx");
    richEditControl.LoadDocument(templatePath);
    
    // Create mail merge options.
    MailMergeOptions myMergeOptions = richEditControl.Document.CreateMailMergeOptions();
    
    // Assign the data source.
    myMergeOptions.DataSource = nwind?.Customers;
    
    // Register event handlers to customize merge behavior (progress output and dynamic variables).
    richEditControl.MailMergeRecordStarted += RichEditControl_OnMailMergeRecordStarted;
    
    // Execute the mail merge.
    richEditControl.MailMerge(myMergeOptions, "result.docx", DocumentFormat.Docx);
    
    
    // Event handler outputs diagnostic info for each mail merge region
    // and its sub‑regions when a record merge starts.
    void RichEditControl_OnMailMergeRecordStarted(object sender, MailMergeRecordStartedEventArgs e)
    {
        var region = e.MailMergeRegionInfo;
        if (region != null)
        {
            Console.WriteLine($"Merging region: {region.Name}\r\n Merge Fields: {region.MergeFields.Count}");
            if (region.Regions != null && region.Regions.Count > 0)
            {
    
                foreach (var subRegion in region.Regions)
                {
                    Console.WriteLine($" Sub-region: {subRegion.Name}\r\n Merge Fields: {subRegion.MergeFields.Count}");
                }
                Console.ReadKey();
            }
        }
    }
    

    Spreadsheet Control

    Extended OLE Object Support

    DevExpress WPF Spreadsheet Control library allows you to import/export linked and embedded OLE Objects in binary Excel formats (XLS and XLSB). You can create, edit, or remove OLE objects in Excel documents and save these document to binary formats without content loss.

    Download 30-Day Trial

    With numerous new products and dozens of high-impact features, DevExpress UI components allow you to build your best, without limits or compromise. Download our fully-functional 30-day trial today and experience the DevExpress difference today.

    Download: Free 30-day Trial

    Tip

    Your Feedback Matters! Take part in the survey on our website: WPF Survey.