Code Monkey home page Code Monkey logo

toolbelt.blazor.splitcontainer's Introduction

Blazor SplitContainer NuGet Package

Summary

A Blazor component to create panes separated by a slidable splitter bar.

movie

Note
I know the same feature component library, the "BlazorSliders", already exists, but it was a bit unsmooth, particularly on Blazor Server apps. So I've decided to create another one on my hand.

How to use

Installation

  1. Add package to your project like this.
dotnet add package Toolbelt.Blazor.SplitContainer
  1. Open Toolbelt.Blazor.Splitter namespace in _Imports.razor file.
@* This is "_Imports.razor" *@
...
@using Toolbelt.Blazor.Splitter
  1. Then you can use the SplitContainer component in your Blazor app.
<SplitContainer @bind-FirstPaneSize="_PaneSize">

    <FirstPane>
        <h1>Hello</h1>
    </FirstPane>

    <SecondPane>
        <h1>World</h1>
    </SecondPane>

</SplitContainer>

@code {
    private int _PaneSize = 80;
}

Parameters

Parameter Name Type Description
Id string? Gets or sets an id string applied for the "id" attribute of the split container element.
Style string? Gets or sets a CSS style string applied for the "style" attribute of the split container element.
Class string? Gets or sets a CSS class string applied for the "class" attribute of the split container element.
FirstPane RenderFragment The left or top pane in the SplitContainer.
SecondPane RenderFragment The right or bottom pane in the SplitContainer.
Orientation SplitterOrientation Determines if the spliter is vertical or horizontal. The default value is SplitterOrientation.Vertical.
FirstPaneSize int? Determines pixel distance of the splitter from the left or top edge.
FirstPaneMinSize int? Determines the minimum distance of pixels of the splitter from the left or the top edge of first pane.
SecondPaneSize int? Determines pixel distance of the splitter from the right or bottom edge.
SecondPaneMinSize int? Determines the minimum distance of pixels of the splitter from the right or the bottom edge of second pane.
FirstPaneSizeChanged EventCallback A callback that will be invoked when the size of the first pane is changed.
SecondPaneSizeChanged EventCallback A callback that will be invoked when the size of the second pane is changed.

Warning
You can specify the pane size to only either the FirstPaneSize or the SecondPaneSize parameter. If you specify both the FirstPaneSize or the SecondPaneSize parameters, then the splitter won't work.

Orientation

The Orientation parameter represents the "Splitter Bar" orientation that splits the SplitContainer's client area into two panes. The following figures show the layout you will see with each SplitterOrientation enum value set to the Orientation parameter.

Vertical Horizontal
Vertical Horizontal

Pane size

When you set the FirstPaneSize parameter, the first pane will be fixed size, and the second pane will be stretched to fill the remaining area of the SplitContainer.

When the FirstPaneSize parameter was set

On the other hand, when you set the SecondPaneSize parameter, the first pane will be stretched to fill the remaining area of the SplitContainer, and the second pane will be fixed size.

When the SecondPaneSize parameter was set

โš ๏ธ Warning

I strongly recommend binding a pane size parameter to a field variable, like the following example.

<SplitContainer @bind-FirstPaneSize="_PaneSize">
    ...
</SplitContainer>

@code {
    private int _PaneSize = 80;
}

When you set a pane size parameter with a literal value, like below,

<SplitContainer FirstPaneSize="80">
    ...
</SplitContainer>

the pane size might be reset unintendedly to that literal value you specified even after a user has operated to resize the pane.

Save and restore the pane size

Please refer to the following example if you want to save and restore the pane size. The following example shows you how to save and restore the pane size into a web browser's local storage (The example uses the Blazored.LocalStorage NuGet package to access the web browser's local storage API).

@inject ILocalStorageService LocalStorage

<SplitContainer @bind-FirstPaneSize="_PaneSize"
                @bind-FirstPaneSize:after="OnPaneSizeChanged">
    ...
</SplitContainer>

@code {
  private int _PaneSize = 80;

  protected override async Task OnAfterRenderAsync(bool firstRender)
  {
    if (firstRender)
    {
      var paneSizeStr = await this.LocalStorage.GetItemAsStringAsync("_PaneSize");
      if (int.TryParse(paneSizeStr, out var paneSize)) this._PaneSize = paneSize;
      this.StateHasChanged();
    }
  }

  private async Task OnPaneSizeChanged()
  {
    await this.LocalStorage.SetItemAsStringAsync("_PaneSize", _PaneSize.ToString());
  }
}

Change the size of the splitter bar

The size of the splitter bar is defined by the CSS custom property named --splitter-bar-size scoped in the split-container CSS class (The default value is '4px'). So you can change the size of the splitter bar by overriding that CSS custom property value like the following example.

::deep .split-container {
    --splitter-bar-size: 14px;
}

Release Note

Release notes

License

Mozilla Public License Version 2.0

toolbelt.blazor.splitcontainer's People

Contributors

jsakamoto avatar steventcramer avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.