![]() |
VOOZH | about |
dotnet add package AvaloniaControls.Ribbon.Flowery --version 2026.6.7
NuGet\Install-Package AvaloniaControls.Ribbon.Flowery -Version 2026.6.7
<PackageReference Include="AvaloniaControls.Ribbon.Flowery" Version="2026.6.7" />
<PackageVersion Include="AvaloniaControls.Ribbon.Flowery" Version="2026.6.7" />Directory.Packages.props
<PackageReference Include="AvaloniaControls.Ribbon.Flowery" />Project file
paket add AvaloniaControls.Ribbon.Flowery --version 2026.6.7
#r "nuget: AvaloniaControls.Ribbon.Flowery, 2026.6.7"
#:package AvaloniaControls.Ribbon.Flowery@2026.6.7
#addin nuget:?package=AvaloniaControls.Ribbon.Flowery&version=2026.6.7Install as a Cake Addin
#tool nuget:?package=AvaloniaControls.Ribbon.Flowery&version=2026.6.7Install as a Cake Tool
This is a Ribbon Control Component library that replicates Microsoft's Ribbon UI, as seen in Windows 8+'s File Explorer, Microsoft Office 2007+, and in various other places, for Avalonia. In its present state, it is reasonably usable, but some features are still missing, so it should not considered complete.
The original project was developed by amazerol and was then optimized by Splitwirez. Once the Avalonia 11 was released it was then ported to 11.0.1 by NOoBODDY. The original version of the component is used in Jaya File Manager, but other projects are welcome to use it as well.
Note This fork by tobitege focuses on providing a current, compilable NuGet version of Avalonia.Ribbon, including fixes, and a Flowery.NET demo to show how to theme the control. To avoid collisions with upstream packages, this fork publishes under its own package IDs:
AvaloniaControls.Ribbon.FloweryandAvaloniaControls.Ribbon.Desktop.Flowery.
Given that Avalonia is a cross-platform UI framework and to support the availability, currently, this project is being optimized by Sachith Liyanagama. The overall controls library is refactored as follows.
| Project | Usecase |
|---|---|
| AvaloniaUI.Ribbon | Desktop, WASM, etc. |
| AvaloniaUI.Ribbon.Desktop | Desktop Only |
In order to support the ControlTheme architecture, the controls are currently being either optimized or re-developed if necessary. Based on the platform availability the components are summarized as follows.
| Control Type | Component Type |
|---|---|
| Ribbon | Ribbon |
| Button | RibbonButton |
| Toggle Button | RibbonToggleButton |
| Split Button | RibbonSplitButton |
| Gallery | RibbonGallery |
| GalleryItem | GalleryItem |
| Drop Down Button | RibbonDropDownButton |
| File Menu | RibbonMenu |
| File Menu Item | RibbonMenuItem |
| Tab | RibbonTab |
| Ribbon Group Box | RibbonGroupBox |
| Ribbon Combo Box | RibbonComboBox |
| Group Triple | RibbonGroupTriple |
| Group Lines | RibbonGroupLines |
| Group Cluster | RibbonGroupCluster |
docs/main-library-controls.mddocs/group-containers.mdApart from the above-mentioned global components, the desktop-specific controls are presented below.
| Control Type | Original |
|---|---|
| Ribbon Window | RibbonWindow |
| Quick Access Bar | QuickAccessToolBar |
| New controls | Group containers |
|---|---|
| Wrapping / overflow | |
| Desktop | WASM |
| Ribbon Menu / Backstage |
Refer the package according to your usecase as mentioned in above Cross-Platform Support Section.
Include ribbon styles to App.xaml as shown below.
Default theme:
<StyleInclude Source="avares://AvaloniaUI.Ribbon/Styles/Fluent/AvaloniaRibbon.xaml" />
"DESKTOP" theme:
<StyleInclude Source="avares://AvaloniaUI.Ribbon.Desktop/Styles/Default/AvaloniaRibbon.xaml" />
and localized text (same for both themes):
<ResourceInclude Source="avares://AvaloniaUI.Ribbon/Locale/en-ca.xaml" />
Use this when you want Ribbon visuals to follow Flowery Daisy theme tokens.
Add NuGet packages:
<ItemGroup>
<PackageReference Include="AvaloniaControls.Ribbon.Flowery" Version="*" />
<PackageReference Include="Flowery.NET" Version="*" />
<PackageReference Include="AvaloniaControls.Ribbon.Desktop.Flowery" Version="*" />
</ItemGroup>
Add Flowery theme and Ribbon styles in App.axaml:
<Application
xmlns="https://github.com/avaloniaui"
xmlns:daisy="clr-namespace:Flowery;assembly=Flowery.NET">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="avares://AvaloniaUI.Ribbon/Locale/en-ca.axaml" />
<ResourceInclude Source="/Themes/FloweryRibbonBridge.axaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
<Application.Styles>
<FluentTheme />
<daisy:DaisyUITheme />
<StyleInclude Source="avares://AvaloniaUI.Ribbon/Styles/Fluent/AvaloniaRibbon.axaml" />
</Application.Styles>
</Application>
Add a bridge resource dictionary (for example Themes/FloweryRibbonBridge.axaml) that maps Ribbon legacy brush keys (such as ThemeBackgroundBrush, ThemeAccentBrush*, ButtonForeground, ToggleButton*, ComboBox*) to Flowery Daisy colors (DaisyBase*, DaisyPrimary*, DaisyAccent*, DaisyNeutral*).
For a complete working reference, see:
AvaloniaUI.Ribbon.Demo.Flowery/App.axaml
AvaloniaUI.Ribbon.Demo.Flowery/Themes/FloweryRibbonBridge.axaml
Use the below mentioned sample as an example to use the ribbon control.
The sample is available in the AvaloniaUI.Ribbon.Demo project.
<Ribbon Name="RibbonControl" DockPanel.Dock="Top" Orientation="Horizontal" HelpButtonCommand="{Binding HelpCommand}">
<RibbonMenu
Width="50"
KeyTip.KeyTipKeys="F">
<RibbonMenuItem Header="New" Group="File" IsTopDocked="True">
<RibbonMenuItem.Icon>
<Rectangle
Width="32"
Height="32"
Fill="Red" />
</RibbonMenuItem.Icon>
<RibbonMenuItem.Content></RibbonMenuItem.Content>
</RibbonMenuItem>
<RibbonMenuItem Header="Open" Group="File" IsTopDocked="True">
<RibbonMenuItem.Icon>
<Rectangle
Width="32"
Height="32"
Fill="Green" />
</RibbonMenuItem.Icon>
<RibbonMenuItem.Content>
<DockPanel>
<TabControl DockPanel.Dock="Top">
<TabItem Header="TEST" />
</TabControl>
</DockPanel>
</RibbonMenuItem.Content>
</RibbonMenuItem>
</Ribbon.Menu>
<RibbonTab Header="Button Controls" KeyTip.KeyTipKeys="B">
<RibbonTab.Groups>
<RibbonGroupBox Header="RibbonButtons" Command="{Binding OnClickCommand}" KeyTip.KeyTipKeys="B">
<RibbonButton Content="Large" MinSize="Large" MaxSize="Large">
<RibbonButton.LargeIcon>
<Rectangle Fill="{DynamicResource ThemeForegroundBrush}" Width="32" Height="32">
<Rectangle.OpacityMask>
<ImageBrush Source="/Assets/RibbonIcons/settings.png"/>
</Rectangle.OpacityMask>
</Rectangle>
</RibbonButton.LargeIcon>
</RibbonButton>
</RibbonGroupBox>
<RibbonGroupBox Header="RibbonToggleButtons" Command="{Binding OnClickCommand}" KeyTip.KeyTipKeys="T">
<RibbonToggleButton
Content="Large"
Icon="{DynamicResource Icon1}"
LargeIcon="{DynamicResource Icon1Large}"
MaxSize="Large"
MinSize="Large"
QuickAccessIcon="{DynamicResource Icon1QuickAccess}" />
<RibbonToggleButton
Content="Medium"
Icon="{DynamicResource Icon2}"
LargeIcon="{DynamicResource Icon2Large}"
MaxSize="Medium"
MinSize="Medium"
QuickAccessIcon="{DynamicResource Icon2QuickAccess}" />
</RibbonGroupBox>
<RibbonGroupBox Header="RibbonSplitButtons" Command="{Binding OnClickCommand}" KeyTip.KeyTipKeys="S">
<SplitButtonControl
x:Name="RibbonSplitButton1"
Content="Large"
Icon="{DynamicResource Icon1}"
LargeIcon="{DynamicResource Icon1Large}"
QuickAccessIcon="{DynamicResource Icon1QuickAccess}"
Size="Large"
Theme="{StaticResource LargeSplitButton}">
<SplitButtonControl.Flyout>
<MenuFlyout Placement="Bottom">
<MenuItem Header="Item 1">
<MenuItem Header="Subitem 1" />
<MenuItem Header="Subitem 2" />
<MenuItem Header="Subitem 3" />
</MenuItem>
<MenuItem Header="Item 2" InputGesture="Ctrl+A" />
<MenuItem Header="Item 3" />
</MenuFlyout>
</SplitButtonControl.Flyout>
</SplitButtonControl>
</RibbonGroupBox>
</RibbonTab.Groups>
</RibbonTab>
<RibbonTab Header="Galleries" KeyTip.KeyTipKeys="G">
<RibbonTab.Groups>
<RibbonGroupBox Header="Large gallery" Command="{Binding OnClickCommand}" KeyTip.KeyTipKeys="L">
<Gallery Theme="{StaticResource LargeGallery}">
<GalleryItem Content="Item 1">
<GalleryItem.LargeIcon>
<ControlTemplate>
<Rectangle
Width="32"
Height="32"
Fill="Red" />
</ControlTemplate>
</GalleryItem.LargeIcon>
</GalleryItem>
<GalleryItem Content="Item 2">
<GalleryItem.LargeIcon>
<ControlTemplate>
<Rectangle
Width="32"
Height="32"
Fill="OrangeRed" />
</ControlTemplate>
</GalleryItem.LargeIcon>
</GalleryItem>
</Gallery>
</RibbonGroupBox>
</RibbonTab.Groups>
</RibbonTab>
</Ribbon>
By default, ribbon groups keep the existing behavior: a single row that shrinks groups from Large to Small when width is limited.
For narrow layouts, you can opt in to wrapping groups across rows before shrinking:
<Ribbon
Orientation="Horizontal"
GroupOverflowBehavior="WrapThenShrink"
MaxGroupRows="2">
</Ribbon>
GroupOverflowBehavior="ShrinkOnly" (default): single-row, shrink-first behavior.GroupOverflowBehavior="WrapThenShrink": use up to MaxGroupRows rows, then shrink if still overflowing.MaxGroupRows: minimum value is 1.MaxGroupRows has no built-in upper limit in the control; demos can clamp the value for UX (for example 1..10).WrapThenShrink, default RibbonGroupWrapPanel internals cap small-item lines with MaxGroupRows.Use group containers inside RibbonGroupBox to create canonical Ribbon layouts:
Developer details (API defaults, layout behavior, styling hooks):
docs/group-containers.md<RibbonGroupBox Header="Clipboard">
<RibbonGroupTriple>
<RibbonButton Content="Paste" MinSize="Medium" MaxSize="Large" />
<RibbonButton Content="Paste Special" MinSize="Small" MaxSize="Medium" />
<RibbonButton Content="Format" MinSize="Small" MaxSize="Medium" />
</RibbonGroupTriple>
<RibbonGroupLines>
<RibbonButton Content="Cut" MinSize="Small" MaxSize="Medium" />
<RibbonButton Content="Copy" MinSize="Small" MaxSize="Medium" />
<RibbonButton Content="Copy Path" MinSize="Small" MaxSize="Medium" />
<RibbonGroupCluster>
<RibbonToggleButton Content="Bold" MinSize="Small" MaxSize="Medium" />
<RibbonToggleButton Content="Italic" MinSize="Small" MaxSize="Medium" />
<RibbonToggleButton Content="Underline" MinSize="Small" MaxSize="Medium" />
</RibbonGroupCluster>
</RibbonGroupLines>
</RibbonGroupBox>
All group containers share these base properties:
DisplayMode: inherited from the parent RibbonGroupBox (Large/Small group mode).MinimumSize / MaximumSize: RibbonControlSize values (Small, Medium, Large) used to clamp the computed child size range.ItemSpacing: spacing between arranged child items.Quick reference:
| Container | MinimumSize default |
MaximumSize default |
Large-mode target size |
|---|---|---|---|
Base RibbonGroupContainer |
Small |
Large |
Large (then clamped by min/max) |
RibbonGroupTriple |
Small |
Large |
Large (then clamped by min/max) |
RibbonGroupLines |
Small |
Large |
Medium (then clamped by min/max) |
RibbonGroupCluster |
Small |
Medium |
Medium (then clamped by min/max) |
RibbonGroupTriple:
MaxItemsPerColumn slots before starting the next column.MaxItemsPerColumn (default 3) controls vertical stack height, and ItemAlignment (Near, Center, Far) controls horizontal alignment inside each slot.Large, Medium, and Small item states via inherited min/max size clamping.RibbonGroupLines:
LargeLineCount (default 2) for large group mode and SmallLineCount (default 3) for small group mode.Large requests to Medium, which matches canonical ribbon line groups.RibbonGroupCluster:
Large to Medium; defaults to ItemSpacing=0 for contiguous buttons.cluster-first, cluster-middle, cluster-last, cluster-single) and Fluent theme styles apply faint borders globally so banks remain visually distinct in dark and light themes.Composing banks in rows:
<RibbonGroupLines LargeLineCount="2" SmallLineCount="3">
<RibbonGroupCluster>
<RibbonButton Content="A" MinSize="Small" MaxSize="Medium" />
<RibbonButton Content="B" MinSize="Small" MaxSize="Medium" />
<RibbonButton Content="C" MinSize="Small" MaxSize="Medium" />
</RibbonGroupCluster>
<RibbonGroupCluster>
<RibbonButton Content="D" MinSize="Small" MaxSize="Medium" />
<RibbonButton Content="E" MinSize="Small" MaxSize="Medium" />
<RibbonButton Content="F" MinSize="Small" MaxSize="Medium" />
</RibbonGroupCluster>
</RibbonGroupLines>
Each RibbonGroupCluster is one bank; RibbonGroupLines controls how many banks appear per row via its line-count properties.
RibbonButton, RibbonToggleButton, RibbonDropDownButton, and RibbonSplitButton so UIA clients receive stable names, automation IDs, help text, invoke/toggle providers, and expand/collapse state.AutomationProperties, and automation provider behavior.Avalonia packages now target 12.0.3.AvaloniaUI.Ribbon and AvaloniaUI.Ribbon.Desktop now target net8.0.net10.0-browser.Xaml.Behaviors, CommunityToolkit.Mvvm, System.Text.Json, Flowery.NET, and Material.Avalonia.WindowDecorations in place of removed decoration APIs,TopLevel.GetTopLevel,RibbonWindow chrome/template usage for Avalonia 12 compatibility.Ribbon.QuickAccessItems now defaults to a reference-unique collection so the same control instance cannot be added twice.DesktopRibbonQuickAccessTests.GroupDisplayMode now includes Medium.Large -> Medium -> Small and re-expand through Medium.RibbonGroupsStackPanel tests now verify wrap-first (WrapThenShrink) behavior before shrinking.avares:// URIs in updated ribbon style files and demos for consistent resource resolution.docs/main-library-controls.md, artifacts-local/avalonia-ribbon-krypton-parity-roadmap.md).RibbonGroupBox now exposes AllowCollapsedPopup, read-only IsCollapsedToPopup, and dedicated DialogLauncherCommand / DialogLauncherCommandParameter API (with legacy command aliases preserved).RibbonGroupsStackPanel can collapse overflowed groups into popup affordances when groups can no longer fit at small size.RibbonTextBox, RibbonDatePicker, RibbonNumericUpDown, RibbonCheckBox, RibbonRadioButton, RibbonLabel, RibbonSeparator.ShortcutKeys support added to actionable controls (RibbonButton, RibbonToggleButton, RibbonDropDownButton, RibbonSplitButton, SplitButtonControl).RibbonRecentDocument model and RibbonMenu.RecentDocuments collection.GalleryRange) and hover tracking event (ItemHoverChanged).Gallery.BringIntoView(int index) API for index-based navigation.RibbonContextualTabGroup.ContextColor added and synchronized with Background for compatibility.GroupPopupTests, DialogLauncherTests, NewControlsTests, KeyboardShortcutTests, RecentDocsTests, GalleryTests, ContextualTabGroupTests).RibbonGroupWrapPanel as the default internal layout panel in RibbonGroupBox.RibbonGroupWrapPanel via LargeLineCount / SmallLineCount, including cap-aware measure/arrange behavior.RibbonGroupWrapPanel.SmallLineCount to ribbon MaxGroupRows when GroupOverflowBehavior="WrapThenShrink" to prevent internal over-row rendering.AvaloniaUI.Ribbon.Tests (RibbonGroupContainerTests and RibbonGroupsStackPanelTests).README.md and docs/main-library-controls.md to match current RibbonGroupWrapPanel behavior.RibbonGroupContainer, RibbonGroupLines, RibbonGroupCluster, RibbonGroupTriple) with alignment/contracts and Fluent style integration.AvaloniaUI.Ribbon.W11) and centralize Windows 11 ribbon icon resources.RibbonGroupContainerTests to tests projectIValueConverter / IMultiValueConverter) to remove interface nullability mismatches.StyledProperty<T>/StyledProperty<T?>) and remove unsafe null unboxing paths.GroupOverflowBehavior (ShrinkOnly, WrapThenShrink) and configurable MaxGroupRows.RibbonGroupsStackPanel, including expansion back to Large when space increases.AvaloniaUI.Ribbon.Tests for default behavior, wrap-before-shrink behavior, shrink fallback, re-expansion, and MaxGroupRows > 2.1..10 in demo UX),Wrap Lab tab to demonstrate behavior under constrained width.ComboBox from the default desktop demo.RibbonDropDownButton flyout behavior so it no longer auto-closes shortly after opening and opens reliably again.scripts/run-desktop.ps1 now runs the regular desktop demo,scripts/run-flowery.ps runs the Flowery demo.Large buttons were not correctly hidden when the ribbon bar was collapsed/minimized.AvaloniaUI.Ribbon.Demo.Flowery as a Flowery.NET-based demo project.Directory.Build.targets.AvaloniaControls.Ribbon.Flowery and AvaloniaControls.Ribbon.Desktop.Flowery.RibbonWindow is now an actual Window in its own rightGallery controlRibbonMenuRibbon can now be collapsed or expanded (shows selected groups temporarily in a Popup when a tab is clicked if the
Ribbon is collapsed)Ribbon can now be horizontally or vertically oriented (real-time value changes are not yet fully functional, but
compile-time/startup-time changes should work without a hitch)KeyTips and Keyboard navigation via ALT are now mostly functionalApp.xaml, only one line of <StyleInclude> is required now.Below mentioned are some plans for the future.
The remaining things which have be done are as follows.
Please acknowledge Splitwirez for all the last new features added to the ribbon. As far as I'm concerned, I'm just centralizing code and updating the nuget.
You can also acknowledge Rubal Walia as well for cleaning up all my messy code.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 1 NuGet packages that depend on AvaloniaControls.Ribbon.Flowery:
| Package | Downloads |
|---|---|
|
AvaloniaControls.Ribbon.Desktop.Flowery
Desktop-Specific version of AvaloniaUI Ribbon controls. In case you would like to develop a single Cross-Platform app, use the AvaloniaControls.Ribbon.Flowery package instead. |
This package is not used by any popular GitHub repositories.