Blazor创建TabControl组件

Blazor创建TabControl组件

创建一个Blazor TabControl组件,有两个目标知识点

最后更新 2021-12-06 22:01
Blazor University
预计阅读 4 分钟
分类
Blazor
标签
.NET Blazor 前端

不是全文翻译,部分翻译自认为可能不准确,就原文照搬了。

创建一个 Blazor TabControl 组件,有两个目标知识点:

  1. Pass data into a RenderFragment to give it context.
  2. Use a CascadingParameter to pass the parent TabControl component into its child TabPage components.

下面看最终效果图:

实操开始:

请先创建一个 Blazor 项目(Blazor Client 或者 Server 皆可,我们以 Blazor Server 为例),

第一步,创建两个组件:TabControlTabPageTabPage组件有一个父TabControl属性引用(属性名Parent,添加CascadingParameter特性)。

TabControl 组件:

文件路径:./Shared/TabControl.razor

<div>这是一个TabControl</div>
<CascadingValue Value="this"> @ChildContent </CascadingValue>

@code { // 如果我们想以<TabPage
  >标签的形式使用TabPage,那么下面的代码是必须的 [Parameter] public
  RenderFragment? ChildContent { get; set; } }</TabPage
>

TabPage 组件:

文件路径:./Shared/TabPage.razor

<div>这是一个TabPage</div>
@ChildContent @code { [CascadingParameter] private TabControl? Parent { get;
set; } [Parameter] public RenderFragment? ChildContent { get; set; } protected
override void OnInitialized() { if (Parent == null) throw new
ArgumentNullException(nameof(Parent), "TabPage必须包含TabControl引用");
base.OnInitialized(); } }

TabControl 关联 TabPage

TabPageOnInitialized方法中添加下面这一行代码,使TabPage关联上TabControl

Parent.AddPage(this);

AddPage方法见下面的代码,在TabControl调用AddPage方法保存引用后,我们在TabControl中添加ActivePage属性,同样看下面的代码:

public TabPage? ActivePage { get; set; }
readonly List<TabPage> _pages = new();

internal void AddPage(TabPage tabPage)
{
    _pages.Add(tabPage);
    if (_pages.Count == 1)
        ActivePage = tabPage;
    StateHasChanged();
}

AddPage组件添加一个Text属性用于展示。

[Parameter]
public string? Text { get; set; }

TabControl中添加以下标签(在ChildContent渲染之前),这些标签会一次性全部渲染出来,当点击某个TabPage时会改变TabControl的选择项。

<div class="btn-group" role="group">
  @foreach (TabPage tabPage in Pages)
  {
    <button type="button"
      class="btn @GetButtonClass(tabPage)"
      @onclick=@( ()=>ActivatePage(tabPage) )>
      @tabPage.Text
    </button>
  }
</div>

上面这些标签会创建标准的 Bootstrap 按钮组,每个TabPage会创建一个有以下特征的按钮:

  1. CSS 类设置为"btn",并通过GetButtonClass方法追加 CSS 类名,如果当前TabPageActivePage,添加 CSS 类btn-primary,否则添加btn-secondary
  2. 当点击按钮时会激活点击的TabPage

注意@onclick需要关联一个无参的方法,所以 lambda 表达式用一个内联的@( )来设置点击的TabPageActivatePage

  1. 按钮的文字通过TabPageText属性设置。

下面的代码添加到TabControl的代码区域。

string GetButtonClass(TabPage page)
{
  return page == ActivePage ? "btn-primary" : "btn-secondary";
}
void ActivatePage(TabPage page)
{
  ActivePage = page;
}

使用TabControl

添加一个TabControlTest组件:

文件名:./Pages/TabControlTest.razor

@page "/tabcontroltest"

<TabControl>
  <TabPage Text="Tab 1">
    <h1>The first tab</h1>
  </TabPage>
  <TabPage Text="Tab 2">
    <h1>The second tab</h1>
  </TabPage>
  <TabPage Text="Tab 3">
    <h1>The third tab</h1>
  </TabPage>
</TabControl>

@code { }

在./Shared/NavMenu 中添加TabControlTest路由

省略部分代码
<div class="nav-item px-3">
  <NavLink class="nav-link" href="tabcontroltest">
    <span class="oi oi-plus" aria-hidden="true"></span> TabControl Test
  </NavLink>
</div>
省略部分代码

这样就完了吗?我们看看现在的效果:

不对吧,三个TabPage的内容全部显示出来了,解决这个问题只需要在TabPage渲染ChildContent时判断当前TabPage是否为TabControl选中的页,选中项才进行渲染:

@if (Parent.ActivePage == this)
{
  @ChildContent
}

OK 代码完,效果见本文开头。

文中代码已放:GitHub

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2021-12-30

Blazor系列终结!

Blazor系列转载`终结啦`,其实站长在25号时就已`完成转载`,并同步在`Dotnet9`网站(`https://dotnet9.com`)发布,并创建了一个专辑`《大家一起学Blazor》`,大家可随时在网站浏览。

继续阅读
同分类 / 同标签 2024-02-29

Winform中也可以这样做数据展示

在做winform开发的过程中,经常需要做数据展示的功能,之前一直使用的是gridcontrol控件,今天想通过一个示例,跟大家介绍一下如何在winform blazor hybrid中使用ant design blazor中的table组件做数据展示。

继续阅读
同分类 / 同标签 2024-02-29

Winform的界面也可以变好看?

前几天跟大家介绍了在winform中使用blazor hybrid,而且还说配上blazor的ui可以让我们的winform程序设计的更加好看,接下来我想以一个在winform blazor hybrid中绘图的例子来进行说明,希望对你有所帮助。

继续阅读