mcpField
S
syncfusion-blazor-tabs

syncfusion-blazor-tabs

github.com/syncfusion其他440 次安装1 周前更新
代码仓库

关于 syncfusion-blazor-tabs

此技能指导开发者在 Blazor 应用中实现 Syncfusion Blazor 的 SfTab 选项卡组件,涵盖动态管理、布局、选择事件、模板、无障碍支持和状态持久化。

主要功能

  1. 01水平或垂直放置选项卡标题
  2. 02动态添加和移除选项卡
  3. 03绑定选择状态并以代码控制
  4. 04模板、动画与事件处理
  5. 05溢出处理和状态持久化
  6. 06键盘与屏幕阅读器无障碍支持

适用场景

  1. 01将应用内容整理为多个选项卡
  2. 02构建带条件导航的多步骤向导
  3. 03支持用户拖放重新排列选项卡
  4. 04刷新页面后保留选项卡状态

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/syncfusion/blazor-ui-components-skills --skill syncfusion-blazor-tabs

安装后在 Claude Code 中输入/syncfusion-blazor-tabs确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
accessibility-and-localization.md
advanced-features-and-customization.md
animations.md
content-render-modes.md
getting-started.md
orientation-and-header-placement.md
styling-and-theming.md
tab-item-management.md
tab-selection-and-navigation.md

详细介绍

实现 Syncfusion Blazor 选项卡组件

何时使用此技能

在以下情况下使用 Syncfusion Blazor 选项卡组件:

  • 使用基于选项卡的导航将内容整理成多个部分
  • 创建用于内容整理和切换的选项卡界面
  • 处理以编程方式触发和由用户操作触发的选项卡选择
  • 动态添加、移除或管理选项卡项
  • 实现垂直或水平选项卡布局
  • 构建可适应不同屏幕尺寸的响应式选项卡界面
  • 创建用于分层整理内容的嵌套选项卡结构
  • 自定义选项卡的外观、样式和动画
  • 使用条件导航实现多步骤向导
  • 启用拖放功能以重新排列选项卡
  • 在页面刷新后保留选项卡状态

组件概述

Syncfusion Blazor 选项卡组件(SfTab)提供灵活、易于访问且功能丰富的选项卡式导航界面,支持:

  • 多个具有可自定义标题和内容的选项卡项
  • 动态管理选项卡(以编程方式添加/移除项)
  • 多种标题位置(顶部、底部、左侧、右侧)
  • 响应式溢出模式(可滚动、弹出式)
  • 通过 SelectedItem 属性进行双向绑定
  • 用于用户交互的全面事件系统
  • 内容渲染模式(动态、按需、初始)
  • 使用 ContentTemplate 和 HeaderTemplate 进行丰富的模板自定义
  • 支持多种效果的动画
  • 通过浏览器 Cookie 持久化状态
  • 完全支持键盘操作和屏幕阅读器
  • 支持拖放以重新排列选项卡
主要组件
  • SfTab:管理所有选项卡的主容器组件
  • TabItems:选项卡项的集合容器
  • TabItem:包含标题和内容的单个选项卡
  • TabHeader:用于配置选项卡标题、图标和位置的标题
  • TabEvents:用于处理选项卡交互的事件处理程序
  • TabAnimationSettings:用于配置选项卡切换动画
  • ContentTemplate:用于呈现复杂内容的模板
  • HeaderTemplate:用于自定义标题呈现的模板

安装和设置

先决条件
  • .NET 6.0 或更高版本
  • Blazor WebAssembly 或 Blazor Server 应用程序
安装 NuGet 包
// Install via Package Manager Console
Install-Package Syncfusion.Blazor.Navigations
Install-Package Syncfusion.Blazor.Themes

或通过 .NET CLI:

dotnet add package Syncfusion.Blazor.Navigations
dotnet add package Syncfusion.Blazor.Themes
注册 Syncfusion Blazor 服务

在 Program.cs 中:

using Syncfusion.Blazor;

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.Services.AddSyncfusionBlazor();
await builder.Build().RunAsync();
添加命名空间

在 _Imports.razor 中:

@using Syncfusion.Blazor
@using Syncfusion.Blazor.Navigations
添加主题和脚本引用

在 index.html(<head> 部分中):

<link href="_content/Syncfusion.Blazor.Themes/bootstrap5.css" rel="stylesheet" />
<script src="_content/Syncfusion.Blazor.Core/scripts/syncfusion-blazor.min.js" type="text/javascript"></script>

基本实现

最简 Blazor 选项卡组件设置
@using Syncfusion.Blazor.Navigations

<SfTab>
    <TabItems>
        <TabItem>
            <ChildContent>
                <TabHeader Text="Tab 1"></TabHeader>
            </ChildContent>
            <ContentTemplate>
                <div>Content for Tab 1</div>
            </ContentTemplate>
        </TabItem>
        <TabItem>
            <ChildContent>
                <TabHeader Text="Tab 2"></TabHeader>
            </ChildContent>
            <ContentTemplate>
                <div>Content for Tab 2</div>
            </ContentTemplate>
        </TabItem>
        <TabItem>
            <ChildContent>
                <TabHeader Text="Tab 3"></TabHeader>
            </ChildContent>
            <ContentTemplate>
                <div>Content for Tab 3</div>
            </ContentTemplate>
        </TabItem>
    </TabItems>
</SfTab>

核心 API 参考

SfTab 组件属性
属性类型默认值描述示例
AllowDragAndDropboolfalse启用选项卡的拖放排序AllowDragAndDrop="true"
CssClassstringnull应用于 Tab 容器的 CSS 类CssClass="e-fill"
DragAreastringnull设置可拖动元素的移动区域;在该区域之外无法拖动DragArea="body"
EnablePersistenceboolfalse启用在浏览器 Cookie 中持久化状态EnablePersistence="true"
HeightstringnullTab 组件的高度Height="250px"
HeaderPlacementHeaderPositionTop选项卡标题的位置(Top、Bottom、Left、Right)HeaderPlacement="HeaderPosition.Left"
IDstringnull组件的唯一标识符(持久化时必需)ID="myTabs"
LoadOnContentLoadDynamic内容渲染模式(Dynamic、Demand、Init)LoadOn="ContentLoad.Demand"
OverflowModeOverflowModeScrollable选项卡溢出时的行为(Scrollable、Popup)OverflowMode="OverflowMode.Popup"
ReorderActiveTabbooltrue从弹出窗口单击时重新排列活动选项卡ReorderActiveTab="false"
ScrollStepint0单击导航箭头时滚动的像素数ScrollStep="150"
SelectedItemint0当前选中选项卡的索引(支持双向绑定)@bind-SelectedItem="tabIndex"
ShowCloseButtonboolfalse在选项卡标题上显示关闭按钮ShowCloseButton="true"
SwipeModeTabSwipeModeTabSwipeMode.Touch | TabSwipeMode.Mouse启用用于选项卡导航的滑动手势SwipeMode="TabSwipeMode.Touch"
WidthstringnullTab 组件的宽度Width="500px"
Localestring"en-US"设置用于本地化支持的区域设置Locale="fr-FR"
ShouldReinitializeboolfalse获取或设置一个值,用于指示是否在每次初始化 TabItem 时重新初始化选项卡内容ShouldReinitialize="true"
属性示例

设置 HeaderPlacement 以创建垂直选项卡:

<SfTab HeaderPlacement="HeaderPosition.Left" Height="250px" Width="500px">
    <TabItems>
        
    </TabItems>
</SfTab>

启用选项卡拖放排序:

<SfTab AllowDragAndDrop="true">
    <TabItems>
        
    </TabItems>
</SfTab>

使用 DragArea 属性限制拖动区域:

<div id="dragContainer" style="border: 2px solid blue; padding: 10px;">
    <SfTab AllowDragAndDrop="true" DragArea="#dragContainer">
        <TabItems>
            <TabItem>
                <ChildContent>
                    <TabHeader Text="Tab 1"></TabHeader>
                </ChildContent>
                <ContentTemplate>Tab 1 content</ContentTemplate>
            </TabItem>
            <TabItem>
                <ChildContent>
                    <TabHeader Text="Tab 2"></TabHeader>
                </ChildContent>
                <ContentTemplate>Tab 2 content</ContentTemplate>
            </TabItem>
            <TabItem>
                <ChildContent>
                    <TabHeader Text="Tab 3"></TabHeader>
                </ChildContent>
                <ContentTemplate>Tab 3 content</ContentTemplate>
            </TabItem>
        </TabItems>
    </SfTab>
</div>

使用 SelectedItem 进行双向绑定:

<SfNumericTextBox @bind-Value="SelectedTabIndex" Min="0" Max="4"></SfNumericTextBox>

<SfTab @bind-SelectedItem="SelectedTabIndex">
    <TabItems>
        
    </TabItems>
</SfTab>

@code {
    private int SelectedTabIndex = 0;
}

启用状态持久化:

<SfTab ID="PersistentTabs" EnablePersistence="true">
    <TabItems>
        
    </TabItems>
</SfTab>

自定义可滚动模式下的滚动步长:

<SfTab Width="400px" OverflowMode="OverflowMode.Scrollable" ScrollStep="150">
    <TabItems>
        
    </TabItems>
</SfTab>

禁用滑动手势:

<SfTab SwipeMode="~TabSwipeMode.Touch & ~TabSwipeMode.Mouse">
    <TabItems>
        
    </TabItems>
</SfTab>

设置用于本地化的区域设置:

<SfTab Locale="fr-FR">
    <TabItems>
        <TabItem Content="Onglet 1">
            <ChildContent>
                <TabHeader Text="Tab 1"></TabHeader>
            </ChildContent>
        </TabItem>
    </TabItems>
</SfTab>

使用 ShouldReinitialize 在每次初始化 TabItem 时重新初始化选项卡内容:

@using Syncfusion.Blazor.Navigations
@using Syncfusion.Blazor.Buttons

<SfButton @onclick="ToggleReinitialize">Toggle Re-initialization</SfButton>
<p>Re-initialize: @shouldReinitialize</p>

<SfTab ShouldReinitialize="@shouldReinitialize">
    <TabItems>
        <TabItem>
            <ChildContent>
                <TabHeader Text="Tab 1"></TabHeader>
            </ChildContent>
            <ContentTemplate>
                <div>
                    <p>Content loaded at: @DateTime.Now.ToString("HH:mm:ss.fff")</p>
                    <p>This content reloads every time ShouldReinitialize is triggered</p>
                </div>
            </ContentTemplate>
        </TabItem>
        <TabItem>
            <ChildContent>
                <TabHeader Text="Tab 2"></TabHeader>
            </ChildContent>
            <ContentTemplate>
                <div>
                    <p>Content loaded at: @DateTime.Now.ToString("HH:mm:ss.fff")</p>
                    <p>This content reloads every time ShouldReinitialize is triggered</p>
                </div>
            </ContentTemplate>
        </TabItem>
    </TabItems>
</SfTab>

@code {
    private bool shouldReinitialize = false;

    private async Task ToggleReinitialize()
    {
        shouldReinitialize = !shouldReinitialize;
        await Task.Delay(500);
        shouldReinitialize = !shouldReinitialize;
    }
}

TabItems 集合属性
属性类型默认值描述示例
ItemsListEmpty获取或设置要在选项卡面板中呈现的选项卡项列表Items="@tabItems"
TabItems 属性示例

使用 Items 属性绑定列表中的选项卡项:

@using Syncfusion.Blazor.Navigations

<SfButton @onclick="AddTab">Add Tab</SfButton>
<SfButton @onclick="RemoveTab">Remove Tab</SfButton>

<SfTab>
    <TabItems Items="@TabItems">
    </TabItems>
</SfTab>

@code {
    private List<TabItem> TabItems = new List<TabItem>();

    protected override void OnInitialized()
    {
        TabItems = new List<TabItem>
        {
            new TabItem
            {
                Header = new TabHeader { Text = "HTML" },
                Content = "HTML is the standard markup language"
            },
            new TabItem
            {
                Header = new TabHeader { Text = "CSS" },
                Content = "CSS is used for styling web pages"
            },
            new TabItem
            {
                Header = new TabHeader { Text = "JavaScript" },
                Content = "JavaScript is a programming language"
            }
        };
    }

    private void AddTab()
    {
        TabItems.Add(new TabItem
        {
            Header = new TabHeader { Text = $"New Tab {TabItems.Count + 1}" },
            Content = "New tab content"
        });
    }

    private void RemoveTab()
    {
        if (TabItems.Count > 0)
            TabItems.RemoveAt(TabItems.Count - 1);
    }
}

TabItem 组件属性
属性类型默认值描述示例
Contentstringnull选项卡的简单字符串内容Content="Tab content text"
ContentTemplateRenderFragmentnull用于呈现复杂内容的模板<ContentTemplate>...</ContentTemplate>
Disabledboolfalse禁用选项卡项并阻止其被选中Disabled="true"
HeaderTemplateRenderFragmentnull用于自定义标题呈现的模板<HeaderTemplate>...</HeaderTemplate>
TabIndexint-1用于键盘导航的选项卡顺序TabIndex="0"
Visiblebooltrue显示或隐藏选项卡项Visible="true"
属性示例

禁用特定选项卡项:

<SfTab>
    <TabItems>
        <TabItem Content="Available tab">
            <ChildContent>
                <TabHeader Text="Tab 1"></TabHeader>
            </ChildContent>
        </TabItem>
        <TabItem Disabled="true" Content="Unavailable tab">
            <ChildContent>
                <TabHeader Text="Tab 2 (Disabled)"></TabHeader>
            </ChildContent>
        </TabItem>
    </TabItems>
</SfTab>

切换选项卡可见性:

<SfButton @onclick="ToggleVisibility">Toggle Tab Visibility</SfButton>

<SfTab>
    <TabItems>
        <TabItem Visible="@isTabVisible" Content="Visible/Hidden Tab">
            <ChildContent>
                <TabHeader Text="Toggle Tab"></TabHeader>
            </ChildContent>
        </TabItem>
    </TabItems>
</SfTab>

@code {
    private bool isTabVisible = true;

    private void ToggleVisibility()
    {
        isTabVisible = !isTabVisible;
    }
}

启用 Tab 键导航:

<SfTab>
    <TabItems>
        <TabItem TabIndex="0">
            <ChildContent>
                <TabHeader Text="Tab 1"></TabHeader>
            </ChildContent>
            <ContentTemplate>Content 1</ContentTemplate>
        </TabItem>
        <TabItem TabIndex="0">
            <ChildContent>
                <TabHeader Text="Tab 2"></TabHeader>
            </ChildContent>
            <ContentTemplate>Content 2</ContentTemplate>
        </TabItem>
    </TabItems>
</SfTab>

TabHeader 组件属性
属性类型默认值描述示例
IconCssstringnull选项卡标题图标的 CSS 类IconCss="e-twitter"
IconPositionIconPositionLeft图标相对于文本的位置(Left、Right、Top、Bottom)IconPosition="IconPosition.Top"
Textstringnull标题文本Text="Tab Title"
属性示例

向选项卡标题添加图标:

<SfTab>
    <TabItems>
        <TabItem>
            <ChildContent>
                <TabHeader Text="Twitter" IconCss="e-twitter" IconPosition="IconPosition.Left"></TabHeader>
            </ChildContent>
            <ContentTemplate>Twitter content...</ContentTemplate>
        </TabItem>
        <TabItem>
            <ChildContent>
                <TabHeader Text="Facebook" IconCss="e-facebook" IconPosition="IconPosition.Top"></TabHeader>
            </ChildContent>
            <ContentTemplate>Facebook content...</ContentTemplate>
        </TabItem>
    </TabItems>
</SfTab>

方法
方法参数返回类型描述示例
AddTabList<TabItem> items, int indexTask在指定索引处添加新的选项卡项await Tab.AddTab(newItems, 1)
EnableTabAsyncint index, bool enableTask启用或禁用选项卡项await Tab.EnableTabAsync(0, false)
RemoveTabint indexvoid移除指定索引处的选项卡项Tab.RemoveTab(0)
Selectint indexvoid按索引选择选项卡(非异步)Tab.Select(1)
SelectAsyncint indexTask异步按索引选择选项卡await Tab.SelectAsync(1)
方法示例

动态添加选项卡:

<SfButton @onclick="AddNewTab">Add Tab</SfButton>

<SfTab @ref="TabControl">
    <TabItems>
        
    </TabItems>
</SfTab>

@code {
    private SfTab TabControl;

    private async Task AddNewTab()
    {
        var newTab = new TabItem
        {
            Header = new TabHeader { Text = "New Tab" },
            Content = "New tab content"
        };

        await TabControl.AddTab(new List<TabItem> { newTab }, TabControl.Items.Count);
    }
}

移除选项卡:

<SfButton @onclick="RemoveFirstTab">Remove First Tab</SfButton>

<SfTab @ref="TabControl">
    <TabItems>
        
    </TabItems>
</SfTab>

@code {
    private SfTab TabControl;

    private void RemoveFirstTab()
    {
        if (TabControl.Items.Count > 0)
        {
            TabControl.RemoveTab(0);
        }
    }
}

以编程方式选择选项卡:

<SfButton @onclick="SelectTab">Select Tab 2</SfButton>

<SfTab @ref="TabControl">
    <TabItems>
        
    </TabItems>
</SfTab>

@code {
    private SfTab TabControl;

    private async Task SelectTab()
    {
        await TabControl.SelectAsync(1);
    }
}

有条件地启用/禁用选项卡:

<SfButton @onclick="DisableSecondTab">Disable Tab 2</SfButton>

<SfTab @ref="TabControl" ID="ConditionTab">
    <TabItems>
        
    </TabItems>
</SfTab>

@code {
    private SfTab TabControl;

    private async Task DisableSecondTab()
    {
        await TabControl.EnableTabAsync(1, false);
    }
}

事件和事件参数
事件处理程序类型EventArgs描述触发时机
CreatedEventCallbackCreatedEventArgs在组件创建并完成渲染后触发组件初始化完成
DraggedEventCallbackDragEventArgs拖放操作完成时触发选项卡项放置操作完成
OnDragStartEventCallbackDragStartEventArgs选项卡拖动开始前触发用户开始拖动选项卡
SelectingEventCallbackSelectingEventArgs选项卡选择发生变化前触发用户单击或调用 Select()
SelectedEventCallbackSelectEventArgs选项卡选择发生变化后触发新选项卡变为活动状态
事件参数

SelectingEventArgs:

  • Cancel (bool):设为 true 可阻止选择选项卡
  • PreviousIndex (int):上一个所选选项卡的索引
  • Index (int):正在选择的选项卡索引

SelectEventArgs:

  • Index (int):新选中选项卡的索引
  • PreviousIndex (int):上一个所选选项卡的索引
  • IsInteracted (bool):如果用户单击,则为 true;如果以编程方式选择,则为 false

DragStartEventArgs:

  • Cancel (bool):设为 true 可阻止拖动操作
  • DraggedItem (TabItem):正在拖动的选项卡项
  • Event (MouseEventArgs):浏览器鼠标事件详细信息

DragEventArgs:

  • DraggedItem (TabItem):已拖动的选项卡项
  • DropIndex (int):放置后的新位置索引
  • Event (MouseEventArgs):浏览器鼠标事件详细信息
事件示例

检测用户交互还是以编程方式选择:

@using Syncfusion.Blazor.Navigations

<div>Last action: @lastAction</div>

<SfTab @bind-SelectedItem="SelectedTab">
    <TabEvents Selected="OnSelected"></TabEvents>
    <TabItems>
        <TabItem Content="Tab 1 content">
            <ChildContent>
                <TabHeader Text="Tab 1"></TabHeader>
            </ChildContent>
        </TabItem>
        <TabItem Content="Tab 2 content">
            <ChildContent>
                <TabHeader Text="Tab 2"></TabHeader>
            </ChildContent>
        </TabItem>
    </TabItems>
</SfTab>

@code {
    private int SelectedTab = 0;
    private string lastAction = "None";

    private void OnSelected(SelectEventArgs args)
    {
        if (args.IsInteracted)
        {
            lastAction = $"User clicked Tab {args.Index + 1}";
        }
        else
        {
            lastAction = $"Tab {args.Index + 1} selected programmatically";
        }
    }
}

通过验证阻止选项卡选择:

<SfTab @ref="TabControl">
    <TabEvents Selecting="OnSelecting"></TabEvents>
    <TabItems>
        <TabItem Content="Form content">
            <ChildContent>
                <TabHeader Text="Form"></TabHeader>
            </ChildContent>
        </TabItem>
        <TabItem Content="Confirmation">
            <ChildContent>
                <TabHeader Text="Confirm"></TabHeader>
            </ChildContent>
        </TabItem>
    </TabItems>
</SfTab>

@code {
    private SfTab TabControl;

    private void OnSelecting(SelectingEventArgs args)
    {
        // Prevent moving to confirmation tab if form is invalid
        if (args.Index == 1 && !isFormValid)
        {
            args.Cancel = true;
        }
    }

    private bool isFormValid = false;
}

处理拖放事件:

<SfTab AllowDragAndDrop="true">
    <TabEvents OnDragStart="OnDragStart" Dragged="OnDragged"></TabEvents>
    <TabItems>
        
    </TabItems>
</SfTab>

@code {
    private void OnDragStart(DragStartEventArgs args)
    {
        Console.WriteLine($"Dragging tab: {args.DraggedItem.Header?.Text}");
    }

    private void OnDragged(DragEventArgs args)
    {
        Console.WriteLine($"Tab dropped at position: {args.DropIndex}");
    }
}

功能实现

本节提供关键功能的专项示例。完整的属性示例请参阅上方的核心 API 参考部分。

嵌套选项卡
<SfTab>
    <TabItems>
        <TabItem>
            <ChildContent>
                <TabHeader Text="USA"></TabHeader>
            </ChildContent>
            <ContentTemplate>
                <SfTab>
                    <TabItems>
                        <TabItem Content="New York description">
                            <ChildContent>
                                <TabHeader Text="New York"></TabHeader>
                            </ChildContent>
                        </TabItem>
                        <TabItem Content="Los Angeles description">
                            <ChildContent>
                                <TabHeader Text="Los Angeles"></TabHeader>
                            </ChildContent>
                        </TabItem>
                    </TabItems>
                </SfTab>
            </ContentTemplate>
        </TabItem>
        <TabItem>
            <ChildContent>
                <TabHeader Text="France"></TabHeader>
            </ChildContent>
            <ContentTemplate>
                <SfTab>
                    <TabItems>
                        <TabItem Content="Paris description">
                            <ChildContent>
                                <TabHeader Text="Paris"></TabHeader>
                            </ChildContent>
                        </TabItem>
                        <TabItem Content="Marseille description">
                            <ChildContent>
                                <TabHeader Text="Marseille"></TabHeader>
                            </ChildContent>
                        </TabItem>
                    </TabItems>
                </SfTab>
            </ContentTemplate>
        </TabItem>
    </TabItems>
</SfTab>
动画配置
@using Syncfusion.Blazor.Navigations

<SfTab>
    <TabAnimationSettings>
        <TabAnimationPrevious Effect="AnimationEffect.SlideLeftIn" Duration="500"></TabAnimationPrevious>
        <TabAnimationNext Effect="AnimationEffect.SlideRightIn" Duration="500"></TabAnimationNext>
    </TabAnimationSettings>
    <TabItems>
        <TabItem Content="Tab 1 content">
            <ChildContent>
                <TabHeader Text="Tab 1"></TabHeader>
            </ChildContent>
        </TabItem>
        <TabItem Content="Tab 2 content">
            <ChildContent>
                <TabHeader Text="Tab 2"></TabHeader>
            </ChildContent>
        </TabItem>
    </TabItems>
</SfTab>

可用的动画效果:SlideLeftIn、SlideRightIn、FadeIn、FadeOut、FadeZoomIn、FadeZoomOut、ZoomIn、ZoomOut、None

动态选项卡管理
@using Syncfusion.Blazor.Navigations
@using Syncfusion.Blazor.Buttons

<SfButton @onclick="AddItemClick">Add Tab</SfButton>
<SfButton @onclick="RemoveItemClick">Remove Tab</SfButton>

<SfTab @ref="Tab" ShowCloseButton="true">
    <TabItems>
        @foreach (var item in TabItems)
        {
            <TabItem>
                <ChildContent>
                    <TabHeader Text="@item.Title"></TabHeader>
                </ChildContent>
                <ContentTemplate>
                    <div>@item.Content</div>
                </ContentTemplate>
            </TabItem>
        }
    </TabItems>
</SfTab>

@code {
    private SfTab Tab;
    private List<TabItemData> TabItems = new List<TabItemData>();

    protected override void OnInitialized()
    {
        TabItems = new List<TabItemData>
        {
            new TabItemData { Title = "ASP.NET", Content = "ASP.NET is a web framework..." },
            new TabItemData { Title = "ASP.NET MVC", Content = "ASP.NET MVC implements the MVC pattern..." }
        };
    }

    private void AddItemClick()
    {
        TabItems.Add(new TabItemData { Title = "New Tab", Content = "New content..." });
    }

    private void RemoveItemClick()
    {
        if (TabItems.Count > 0) TabItems.RemoveAt(0);
    }

    public class TabItemData
    {
        public string Title { get; set; }
        public string Content { get; set; }
    }
}

文档参考指南

入门

📄 阅读: references/getting-started.md

  • 前置条件和系统要求
  • NuGet 包安装(Syncfusion.Blazor.Navigations、Syncfusion.Blazor.Themes)
  • 在 _Imports.razor 中导入命名空间
  • 在 Program.cs 中注册服务
  • 在 index.html 中引用主题和脚本
  • 使用 TabItems 和 TabHeader 设置基本选项卡组件
  • 使用标题和内容呈现选项卡项
  • 使用 SelectedItem 进行双向绑定
  • 使用 ContentTemplate 呈现自定义内容
选项卡选择和导航

📄 阅读: references/tab-selection-and-navigation.md

  • SelectedItem 属性绑定和双向绑定模式
  • 使用 Select() 方法同步选择选项卡
  • 使用 SelectAsync() 方法异步选择选项卡
  • 检测用户交互与程序化选择
  • Selected 事件处理程序的实现
  • 用于验证和阻止操作的 Selecting 事件处理程序
  • 管理和监控当前选项卡选择状态
  • 事件参数(Index、PreviousIndex、IsInteracted)
选项卡项管理

📄 阅读: references/tab-item-management.md

  • 使用 AddTab() 方法动态添加选项卡
  • 使用 RemoveTab() 方法移除选项卡
  • 使用 foreach 循环进行条件呈现
  • 使用 ShowCloseButton 允许用户移除选项卡
  • 使用 Disabled 属性阻止选择选项卡
  • 使用 Visible 属性有条件地显示选项卡
  • 使用 TabIndex 属性进行键盘导航
  • 使用 EnableTabAsync() 以编程方式启用或禁用选项卡
方向和标题位置

📄 阅读: references/orientation-and-header-placement.md

  • HeaderPlacement 属性(Top、Bottom、Left、Right 位置)
  • 配置水平或垂直选项卡布局
  • OverflowMode 配置(Scrollable、Popup)
  • 弹出模式下的 ReorderActiveTab 行为
  • 导航箭头的滚动行为
  • 使用 ScrollStep 自定义滚动距离
  • 选项卡换行和溢出处理
  • 响应式标题位置策略
内容呈现模式

📄 阅读: references/content-render-modes.md

  • LoadOn 属性选项(Dynamic、Demand、Init)
  • 使用动态呈现优化性能
  • 使用按需呈现保留状态
  • 使用初始呈现完整访问组件
  • 使用 ContentTemplate 处理复杂内容
  • 不同呈现模式的性能比较
  • 内存和性能优化策略
  • 内容模板的条件呈现
动画

📄 阅读: references/animations.md

  • TabAnimationSettings 配置
  • 用于向后导航的 TabAnimationPrevious 效果
  • 用于向前导航的 TabAnimationNext 效果
  • 可用的动画效果(SlideLeftIn、SlideRightIn、FadeIn、FadeOut、FadeZoomIn、FadeZoomOut、ZoomIn、ZoomOut、None)
  • 配置动画时长
  • 自定义动画选择和时长
  • 禁用动画以提升性能
  • 动画效果组合
样式和主题

📄 阅读: references/styling-and-theming.md

  • 使用 CssClass 属性自定义样式
  • 标题样式类(e-fill、e-background、e-accent)
  • 使用 IconPosition 属性设置图标位置(Left、Right、Top、Bottom)
  • 使用 IconCss 设置选项卡标题图标
  • 选项卡标题文本样式和自定义
  • 主题集成和应用
  • 为选项卡容器应用自定义 CSS 类
  • 响应式样式策略
无障碍访问和本地化

📄 阅读: references/accessibility-and-localization.md

  • 支持键盘导航(Tab、Shift+Tab、方向键)
  • 用于设置键盘导航顺序的 TabIndex 属性
  • 支持屏幕阅读器无障碍访问
  • 为无障碍组件提供 ARIA 属性
  • 用于支持本地化的 Locale 属性
  • 支持 RTL(从右到左)语言
  • 多语言标签页内容
  • 集成 Blazor 本地化
  • Syncfusion 本地化资源
高级功能和自定义

📄 阅读: references/advanced-features-and-customization.md

  • 使用 AllowDragAndDrop 实现标签页重新排序功能
  • 拖放事件处理程序(OnDragStart、Dragged)
  • 使用 EnablePersistence 属性持久化状态
  • 持久化所需的 ID 属性
  • 浏览器 Cookie 存储配置
  • 用于重新初始化内容的 ShouldReinitialize 属性
  • 用于控制触摸和鼠标手势的 SwipeMode
  • 用于自定义渲染的 HeaderTemplate 和 ContentTemplate
  • 嵌套标签页结构和层级组织
  • 使用标签页构建多步骤向导模式
  • 跨标签页步骤进行表单验证
  • TabItem 属性(Visible、Disabled、Content)

集成检查清单

完成选项卡实现前:

  • 设置完成

    • 已安装 Syncfusion.Blazor.Navigations NuGet 包
    • 已安装 Syncfusion.Blazor.Themes NuGet 包
    • 已在 Program.cs 中注册 Syncfusion 服务
    • 已在 _Imports.razor 中导入命名空间
    • 已将主题样式表添加到 index.html
    • 已将脚本引用添加到 index.html
  • 组件配置

    • 已选择 HeaderPlacement(Top/Bottom/Left/Right)
    • 已选择 OverflowMode(Scrollable/Popup)
    • 如有需要,已设置 Width 和 Height 属性
    • 已配置用于渲染内容的 LoadOn 属性
    • 已应用 CssClass 以设置所需的标题样式
  • 选项卡项已配置

    • 已正确标注选项卡标题
    • 已填充内容(通过 Content 属性或 ContentTemplate)
    • 已管理 Disabled 和 Visible 状态
    • 如有需要,已设置 TabIndex 以支持键盘导航
    • 如需动态移除选项卡,已启用关闭按钮
  • 功能已实现

    • 已处理选项卡选择(SelectedItem 或事件处理程序)
    • 如有需要,已实现事件处理程序(Selected、Selecting)
    • 已适当调用方法(AddTab、RemoveTab、SelectAsync)
    • 如有需要,已配置动画设置
    • 如有需要,已启用状态持久化(使用 ID 属性)
    • 如需重新排列选项卡,已启用拖放功能
  • 测试与验证

    • 已测试键盘导航(Tab、Shift+Tab、方向键)
    • 已通过屏幕阅读器验证无障碍功能
    • 已在不同屏幕尺寸下测试响应式行为
    • 事件处理正常工作
    • 动态选项卡操作正常
    • 页面刷新后状态持久化正常
    • 自定义样式已正确应用
  • 性能与优化

    • 已针对内容量优化 LoadOn 属性
    • 已调整 ScrollStep,以改善用户体验
    • 动画效果适合使用场景
    • 如有需要,已延迟加载复杂组件
  • 文档与维护

    • 已在项目中记录组件用法
    • 已清晰标注配置参数
    • 已为事件处理程序添加适当注释
    • 已记录未来维护注意事项

后续步骤:

  1. 从 Documentation Reference Guide 部分查看适用于你使用场景的具体参考指南
  2. 根据需求选择实现模式
  3. 在 Blazor 应用程序中实现并测试
  4. 根据需要自定义样式、动画和行为
  5. 验证无障碍功能和响应式效果
  6. 放心部署

相关资源:

评论

支持 Markdown