A context menu component for Blazor!
⚠️ Warning
This project is build on top of an experimental framework. There are many limitations and there is a high probability that there will be breaking changes each version.
You can find a live demo here.
1. Add the nuget package in your Blazor project
> dotnet add package Blazor.ContextMenu
OR
PM> Install-Package Blazor.ContextMenu
Nuget package page can be found here.
2. Add the following line in your Blazor project's startup class
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddBlazorContextMenu();
}
}
3. Add the following line in your _Imports.razor
@using BlazorContextMenu
4. Reference the static files (Temporary requirement ONLY for Blazor Server-Side projects)
Download and reference the .css and .js from the /BlazorContextMenu/content
folder or use the following package from SQL-MisterMagoo https://github.com/SQL-MisterMagoo/BlazorEmbedLibrary
<ContextMenu Id="myMenu">
<Item OnClick="@OnClick">Item 1</Item>
<Item OnClick="@OnClick">Item 2</Item>
<Item OnClick="@OnClick" Enabled="false">Item 3 (disabled)</Item>
<Seperator />
<Item>Submenu
<SubMenu>
<Item OnClick="@OnClick">Submenu Item 1</Item>
<Item OnClick="@OnClick">Submenu Item 2</Item>
</SubMenu>
</Item>
</ContextMenu>
<ContextMenuTrigger MenuId="myMenu">
<p>Right-click on me to show the context menu !!</p>
</ContextMenuTrigger>
@functions{
void OnClick(ItemClickEventArgs e)
{
Console.WriteLine($"Item Clicked => Menu: {e.ContextMenuId}, MenuTarget: {e.ContextMenuTargetId}, IsCanceled: {e.IsCanceled}, MenuItem: {e.MenuItemElement}, MouseEvent: {e.MouseEvent}");
}
}
You can create templates in the configuration that you can then apply to context menus.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddBlazorContextMenu(options =>
{
options.ConfigureTemplate("myTemplate", template =>
{
template.MenuCssClass = "my-menu";
template.MenuItemCssClass = "my-menu-item";
//...
});
});
}
}
<style>
.my-menu { color: darkblue; }
/* using css specificity to override default background-color */
.my-menu .my-menu-item { background-color: #ffb3b3;}
.my-menu .my-menu-item:hover { background-color: #c11515;}
</style>
<ContextMenu Id="myMenu" Template="myTemplate">
<Item>Item 1</Item>
<Item>Item 2</Item>
</ContextMenu>
You can also change the default template that will apply to all context menus (unless specified otherwise).
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddBlazorContextMenu(options =>
{
//Configures the default template
options.ConfigureTemplate(defaultTemplate =>
{
defaultTemplate.MenuCssClass = "my-default-menu";
defaultTemplate.MenuItemCssClass = "my-default-menu-item";
//...
});
options.ConfigureTemplate("myTemplate", template =>
{
template.MenuCssClass = "my-menu";
template.MenuItemCssClass = "my-menu-item";
//...
});
});
}
}
All components expose CssClass
parameters that you can use to add css classes. These take precedence over any template configuration.
<ContextMenu Id="myMenu" CssClass="my-menu">
<Item CssClass="red-menuitem">Red looking Item</Item>
<Item>Default looking item</Item>
</ContextMenu>
You can override the default css classes completely in the following ways (not recommended unless you want to achieve advanced customization).
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddBlazorContextMenu(options =>
{
//This will override the default css classes for the default template
options.ConfigureTemplate(defaultTemplate =>
{
defaultTemplate.DefaultCssOverrides.MenuCssClass = "custom-menu";
defaultTemplate.DefaultCssOverrides.MenuItemCssClass= "custom-menu-item";
defaultTemplate.DefaultCssOverrides.MenuItemDisabledCssClass = "custom-menu-item--disabled";
//...
});
});
}
}
Using the OverrideDefaultXXX
parameters on components. These take precedence over the template overrides.
<ContextMenu Id="myMenu" OverrideDefaultCssClass="custom-menu">
<Item OverrideDefaultCssClass="custom-menu-item" OverrideDefaultDisabledCssClass="custom-menu-item--disabled">Item 1</Item>
<Item OverrideDefaultCssClass="custom-menu-item" OverrideDefaultDisabledCssClass="custom-menu-item--disabled">Item 2</Item>
</ContextMenu>
Upgrading from 0.12 to 0.13
- Remove the
@addTagHelper *, BlazorContextMenu
as it is no longer needed
Upgrading from 0.11 to 0.12
- The following handlers are removed as they are no longer needed:
ClickAsync
,EnabledHandlerAsync
,VisibleHandlerAsync
- The
Click
handler has been renamed toOnClick
to keep consistency with the framework/suggested event names- The
MenuItemClickEventArgs
class has been renamed to the more appropriateItemClickEventArgs
- The
EnabledHandler
andVisibleHandler
parameters have been removed and replaced with the newOnAppearing
event handler- The
MenuItemEnabledHandlerArgs
andMenuItemVisibleHandlerArgs
classes have been removed and replaced with the newItemAppearingEventArgs
Upgrading from 0.10 to 0.11
- The
CssOverrides
API is removed and override configuration is moved into templates. TheDefaultCssOverrides
of theConfigureTemplate
API must be used.
Upgrading from 0.5 to 0.6
- You must add in
Startup.ConfigureServices
of your Blazor client side project the following lineservices.AddBlazorContextMenu();
- The
BlazorContextMenu.BlazorContextMenuDefaults
API is removed. Use the API provided in the service configuration.
Upgrading from 0.1 to 0.2
- Rename "MenuItem" to "Item"
- Rename "MenuSeperator" to "Seperator"
- Replace "MenuItemWithSubmenu" with a regular "Item" component
0.15
- Added new
OnAppearing
event toContextMenu
conponent, that can be used to prevent the menu from showing.- Added the
WrapperTag
parameter to theContextMenuTrigger
component, that can be used to change theContextMenuTrigger
component's element tag (default: div).- Added the
Id
parameter to theContextMenuTrigger
component.
0.14
- Updated to 3.0 preview 5
0.13
- Updated to 3.0 preview 4
0.12
- Updated to Blazor 0.9.0
- Changed event handlers to the new
EventCallback<>
. As a consequence the following handlers are no longer needed and they are removed:ClickAsync
,EnabledHandlerAsync
,VisibleHandlerAsync
- Fixed menu display position when it doesn't fit on screen
- The
Click
handler has been renamed toOnClick
to keep consistency with the framework/suggested event names- The
MenuItemClickEventArgs
class has been renamed to the more appropriateItemClickEventArgs
- The
EnabledHandler
andVisibleHandler
parameters have been removed and replaced with the newOnAppearing
event handler- The
MenuItemEnabledHandlerArgs
andMenuItemVisibleHandlerArgs
classes have been removed and replaced with the newItemAppearingEventArgs
0.11
- Updated to Blazor 0.8.0
- Added animations
- Default css overrides are now part of the
Templates
API so that you can easily have multiple custom overriden menus- Razor Components are not loading the static files included in the library => #6349. As a workaround you can download and reference directly the .css and .js from the
/BlazorContextMenu/content
folder until the issue is resolved.
0.10
- Added proper support for Razor Components (aka server-side Blazor)
0.9
- Updated to Blazor 0.7.0
- Removed some js interop in favor of the new Cascading Values feature
0.8
- Updated to Blazor 0.6.0
0.7
- Added left-click trigger support
0.6
- Updated to Blazor 0.5.1
- Changed configuration setup
- Added templates
0.5
- Updated to Blazor 0.5.0
0.4
- Added minification for included css/js
- Updated to Blazor 0.4.0
0.3
- Added dynamic EnabledHandlers for menu items
- Added Active and dynamic ActiveHandlers for menu items
0.2
- Updated to Blazor 0.3.0
- Renamed "MenuItem" to "Item" to avoid conflicts with the html element "menuitem"
- Renamed "MenuSeperator" to "Seperator" for consistency
- Removed "MenuItemWithSubmenu" (just use a regular "Item")
0.1
- Initial release
This project was inspired by https://github.com/fkhadra/react-contexify and https://github.com/vkbansal/react-contextmenu