Skip to main content

Native Menu Support

This guide covers native menu bar support in InfiniFrame: configuring menu bars at build time, managing menu items at runtime, and platform-specific behavior.

Contents

Quick Start

using InfiniFrame;
using System.Collections.Immutable;

var window = InfiniFrameWindowBuilder.Create()
.SetTitle("My App")
.SetMenuBar(new InfiniFrameMenuBar(
Items: ImmutableArray.Create(
new InfiniFrameMenuItem("file", "File", InfiniFrameMenuItemType.Submenu,
Children: ImmutableArray.Create(
new InfiniFrameMenuItem("open", "Open", KeyboardShortcut: "Ctrl+O"),
new InfiniFrameMenuItem("save", "Save", KeyboardShortcut: "Ctrl+S"),
new InfiniFrameMenuItem("sep", Type: InfiniFrameMenuItemType.Separator),
new InfiniFrameMenuItem("exit", "Exit", KeyboardShortcut: "Alt+F4")
)
),
new InfiniFrameMenuItem("edit", "Edit"),
new InfiniFrameMenuItem("help", "Help")
)
))
.SetStartUrl("https://myapp.local")
.Build();

window.WaitForClose();

Builder Configuration

Set the menu bar during window construction using SetMenuBar:

var builder = InfiniFrameWindowBuilder.Create()
.SetMenuBar(new InfiniFrameMenuBar(
Items: ImmutableArray.Create(
new InfiniFrameMenuItem("file", "File", InfiniFrameMenuItemType.Submenu,
Children: ImmutableArray.Create(
new InfiniFrameMenuItem("new", "New", KeyboardShortcut: "Ctrl+N"),
new InfiniFrameMenuItem("open", "Open", KeyboardShortcut: "Ctrl+O"),
new InfiniFrameMenuItem("save", "Save", KeyboardShortcut: "Ctrl+S")
)
)
)
));

IInfiniFrameWindow window = builder.Build();

The menu bar is serialized to JSON and passed to the native layer at window creation.

InfiniFrameMenuBar

PropertyTypeDescription
ItemsImmutableArray<InfiniFrameMenuItem>Top-level menu items

InfiniFrameMenuItem

PropertyTypeDefaultDescription
Idstring(required)Unique identifier for programmatic access
Labelstring?nullDisplay text (required for Normal/Submenu)
TypeInfiniFrameMenuItemTypeNormalItem type
IsEnabledbooltrueWhether the item can be interacted with
IsVisiblebooltrueWhether the item is visible
KeyboardShortcutstring?nullKeyboard shortcut (e.g., "Ctrl+S")
ChildrenImmutableArray<InfiniFrameMenuItem>EmptyChild items for submenus

InfiniFrameMenuItemType

ValueDescription
NormalStandard clickable menu item
SeparatorVisual separator between items
SubmenuItem containing child items

Runtime Operations

Once the window is created, you can modify menu items at runtime:

// Disable a menu item
window.Features.Menu.SetMenuItemEnabled("save", false);

// Hide a menu item
window.Features.Menu.SetMenuItemVisible("save", false);

// Send a click command
window.Features.Menu.ClickMenuItem("open");

// Replace the entire menu bar
window.Features.Menu.SetMenuBar(newInMenuBar);

Extension Methods

Fluent extension methods are available for method chaining:

window
.SetMenuBar(newMenuBar)
.SetMenuItemEnabled("save", false)
.SetMenuItemVisible("sep", false)
.ClickMenuItem("open");

Updating Nested Items

Enable/disable and visibility changes work recursively through submenu children:

// This finds "save" inside the "File" submenu
window.Features.Menu.SetMenuItemEnabled("save", false);

Platform Support

FeatureWindowsLinuxmacOS
Menu bar at build time
Runtime menu modification
Keyboard shortcuts
Submenus
Separators
Enable/disable items
Show/hide items
Native click commands
note

Native menu rendering is handled by the platform adapters (Win32, GTK, macOS NSMenu). The managed API is available on all platforms; native rendering support is being implemented incrementally.

Migration from Photino

The Photino ecosystem has an open issue for native menu support (Photino.Native#44). InfiniFrame implements this as a first-class feature with the managed API.

If you were using a custom solution for menus in Photino, you can now use the built-in InfiniFrameMenuBar API:

// Before (Photino - manual approach)
// Custom JavaScript or native interop required

// After (InfiniFrame)
var menuBar = new InfiniFrameMenuBar(
Items: ImmutableArray.Create(
new InfiniFrameMenuItem("file", "File", InfiniFrameMenuItemType.Submenu,
Children: ImmutableArray.Create(
new InfiniFrameMenuItem("exit", "Exit")
)
)
)
);
window.SetMenuBar(menuBar);