{"id":13592296,"url":"https://github.com/RickStrahl/Westwind.Wpf.Statusbar","last_synced_at":"2025-04-08T23:31:51.166Z","repository":{"id":186257260,"uuid":"674904437","full_name":"RickStrahl/Westwind.Wpf.Statusbar","owner":"RickStrahl","description":"A small WPF library to provide animated status bar operations","archived":false,"fork":false,"pushed_at":"2024-04-16T03:44:05.000Z","size":3253,"stargazers_count":25,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-29T16:41:30.538Z","etag":null,"topics":["csharp","dotnet","wpf"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RickStrahl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"RickStrahl","custom":"https://store.west-wind.com/product/donation"}},"created_at":"2023-08-05T05:48:11.000Z","updated_at":"2025-01-02T07:51:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"899cbb3b-5deb-4835-a811-2cf24bbc7767","html_url":"https://github.com/RickStrahl/Westwind.Wpf.Statusbar","commit_stats":null,"previous_names":["rickstrahl/westwind.wpf.statusbar"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RickStrahl%2FWestwind.Wpf.Statusbar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RickStrahl%2FWestwind.Wpf.Statusbar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RickStrahl%2FWestwind.Wpf.Statusbar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RickStrahl%2FWestwind.Wpf.Statusbar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RickStrahl","download_url":"https://codeload.github.com/RickStrahl/Westwind.Wpf.Statusbar/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247947814,"owners_count":21023057,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","dotnet","wpf"],"created_at":"2024-08-01T16:01:07.771Z","updated_at":"2025-04-08T23:31:50.787Z","avatar_url":"https://github.com/RickStrahl.png","language":"C#","funding_links":["https://github.com/sponsors/RickStrahl","https://store.west-wind.com/product/donation"],"categories":["C\\#","C#"],"sub_categories":[],"readme":"# WPF Statusbar Helper and Control\ns \n[![](https://img.shields.io/nuget/v/Westwind.Wpf.Statusbar.svg)](https://www.nuget.org/packages/Westwind.Wpf.Statusbar/)\n ![](https://img.shields.io/nuget/dt/Westwind.Wpf.Statusbar.svg)\n\n![icon](https://raw.githubusercontent.com/RickStrahl/Westwind.Wpf.Statusbar/master/Westwind.WPF.Statusbar/icon.png)\n\nThis is a small WPF library that provides Statusbar functionality in a couple of different ways. \n\n* A basic statusbar control\n* A Statusbar Helper you can apply against your own status bars  \n  *(by providing an icon image control and text control)*\n\n\n![Statusbar Animated Example](https://raw.githubusercontent.com/RickStrahl/Westwind.Wpf.Statusbar/master/ScreenCapture.gif)\n\nHere's an in-app example of the `StatusHelper` in a live application in [Markdown Monster](https://markdownmonster.west-wind.com).\n\n![Demonstration of Statusbar in Markdown Monster](https://raw.githubusercontent.com/RickStrahl/Westwind.Wpf.Statusbar/master/StatusInMM.gif)v\n\n## Features\n\n* **[Simple Status Bar Control](#statusbar-control)**  \nA basic status bar control that has an icon plus 3 status panels that can be individually accessed and managed. Control wraps a Statusbar instance that you can optionally customize with additional panels and custom panel content. Various `ShowStatusXXX()` methods update the main panel's icon and text.\n\n* **[A Status Bar Helper](#statusbar-helper)**  \nIf you prefer to use your own layout for the Statusbar, you can instead use the `StatusbarHelper` to add the status bar update functionality to your own instances. Requires that your Statusbar has an icon `Image` control and a main `TextBlock` area to update which is handled via the helper's `ShowStausXXX()` methods.\n\nBoth of these tools provide the following features:\n\n* Easy to use, single method status updates from anywhere in your app\n* Modes:  Success, Error, Warning, Progress\n* Status relevant icons change based on display mode\n* Icons are animated for attention\n* Spinning icon support typically for progress operations\n* Status messages and icons can be timed out, to revert  \n  back to a default status message and icon.\n* Status updates immediately update UI even in synchronous code\n* Stock icons provided\n* Icon customization available for overriding either \n  globally, per instance or per method using `ImageSource`\n\n\n## Installation\n\nYou can install this library from NuGet:\n\n```ps\n\u003e dotnet add package Westwind.Wpf.Statusbar\n```\n\nor you can include the source code from this repository into your project.\n\n## Statusbar Control\nThe status bar control can just be dropped onto a form by adding the following namespace:\n\n```xml\n\u003cWindow x:Class=\"SampleApp.MainWindow\" ...\n        xmlns:statusbar=\"clr-namespace:Westwind.Wpf.Statusbar;assembly=Westwind.Wpf.Statusbar\"\n\u003e\n```\n\nand the actual control:\n\n```xml\n\u003cstatusbar:StatusbarControl Grid.Row=\"1\" x:Name=\"Statusbar\" /\u003e\n````\n\nIn a window it looks like this:\n\n```xml\n\u003cWindow x:Class=\"SampleApp.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        \n        xmlns:statusbar=\"clr-namespace:Westwind.Wpf.Statusbar;assembly=Westwind.Wpf.Statusbar\"\n        \n        Title=\"MainWindow\" \n        Height=\"400\" Width=\"450\"\u003e\n\n\n    \u003cGrid\u003e\n        \u003cGrid.RowDefinitions\u003e\n            \u003cRowDefinition Height=\"*\"/\u003e\n            \u003cRowDefinition Height =\"Auto\"/\u003e\n        \u003c/Grid.RowDefinitions\u003e\n\n        \u003cStackPanel Width=\"200\" Margin=\"20\"\u003e\n        ... Content here\n        \u003c/StackPanel\u003e\n\n        \u003cstatusbar:StatusbarControl Grid.Row=\"1\" Name=\"Statusbar\" /\u003e\n    \u003c/Grid\u003e\n\u003c/Window\u003e\n```\n\n### Showing Status Messages\nOnce the control is on the page you can simply call the single line display methods to manipulate the status behavior.\n\nThe following are examples that demonstrate individual status operations:\n\n```csharp\n// shows status and resets to default after default timeout\nStatusbar.ShowStatusSuccess(\"Yay. The operation was successful!\");\n```\n\n```csharp\n// shows status and resets to default  after 2 secs\nStatusbar.ShowStatusError(\"Ooops. Something went wrong!\",2000);\n```\n\n```csharp\n// *** Access the embedded StatusbarHelper directly (Statusbar.Status)\n// shows status and resets to default  after 2 secs\nStatusbar.Status.ShowStatusWarning(\"Careful... this might go sideways.\", 2000);\n```\n\n```csharp\n// shows spinning icon indefinitely\nStatusbar.Status.ShowStatusProgress(\"This may take a minute...\");\n```\n\nNote that you can either use the control's methods directly (first two examples) or you can use the `Status` property (last two) which uses the `StatusbarHelper` instance which is the core component.\n\n### Updating Non-Primary Panels\nThe various status methods can be used to update the status bar's primary text panel and icon, but you can also set the optional center and right panels and assign text or content.\n\n```csharp\n// set with plain text\nStatusbar.SetStatusCenter(\"Center Panel Text\");\n\n// set with control content\nvar sp = new StackPanel() { Orientation = Orientation.Horizontal };\nsp.Children.Add(new TextBlock() { Text = \"Right Panel Text\" });\nsp.Children.Add(new Image { Source = StatusIcons.Default.SuccessIcon, Height=15, Margin = new Thickness(3, 0 ,0, 0)});\n\nStatusbar.SetStatusRight(sp);\n\n// Update the primary panel's text only\nStatusbar.StatusText.Text = \"Pull it!\";\n```\n\n### Modifying the Statusbar Layout\nThe status bar control is a UserControl with an embedded `StatusBar` control which is named - `StatusbarInstance` that you can directly access and manipulate. This means you can optionally customize the layout by adding or removing panels and adding custom content beyond the base layout.\n\n\u003e #### Need a custom StatusBar Layout? Use `StatusbarHelper`\n\u003e If you plan on a custom Statusbar layout, my recommendation is to skip the control and use the `StatusbarHelper` on your own custom layout in your host Window or control instead. As long as you have an icon `Image` and main panel `TextBlock` you can use the `StatusbarHelper` to get all feature benefits plus full control over your StatusBar layout in your own XAML code.\n\n## Statusbar Helper\nThe `StatusbarControl` is a quick way to drop a basic status bar on a page, but if you want more control over your status bar layout you can also create and **manage your own Status bar XAML layout**. You can then attach the `StatusbarHelper` to take over the status message display.\n\n### Configuration\nIn order to use the `StatusbarHelper` class a few things are needed:\n\n* A status bar with an icon `Image` control and a `TextBlock` main Status text control\n* If you add a default icon from the default icon collection make\n  sure to add the `icons.xaml` resources to the Window or App resources.\n* Create a property to hold the `StatusbarHelper` instance\n* Initialize and assign property after `InitializeComponents()`\n\n### Custom StatusBar XAML Configuration\nFor example you can embed a status bar control like this into your own Xaml with a default icon taken from the `icons.xaml` resources embedded in the library.\n\n```xml\n\u003c!-- if you use default icon resources you have to add the resources --\u003e\n\u003cWindow x:Class=\"SampleApp.MainWindow\" ...\n        xmlns:statusbar=\"clr-namespace:Westwind.Wpf.Statusbar;assembly=Westwind.Wpf.Statusbar\"\n\u003e\n\u003cWindow.Resources\u003e\n \u003c!-- local - or put this in App.xaml --\u003e\n \u003cResourceDictionary Source=\"pack://application:,,,/Westwind.Wpf.Statusbar;component/Assets/icons.xaml\" /\u003e\n\u003c/Window.Resources\u003e\n...\n\u003c!-- use your own StatusBar control. Use Fixed Height! --\u003e   \n\u003cStatusBar  \n    Height=\"30\"  \n    VerticalAlignment=\"Bottom\" HorizontalAlignment=\"Stretch\"\u003e\n    \u003cStatusBar.ItemsPanel\u003e\n        \u003cItemsPanelTemplate\u003e\n            \u003cGrid\u003e\n                \u003cGrid.ColumnDefinitions\u003e\n                    \u003cColumnDefinition Width=\"Auto\" /\u003e\n                    \u003cColumnDefinition Width=\"*\" /\u003e\n                    \u003cColumnDefinition Width=\"Auto\" /\u003e\n                    \u003cColumnDefinition Width=\"Auto\"  /\u003e\n                \u003c/Grid.ColumnDefinitions\u003e\n            \u003c/Grid\u003e\n        \u003c/ItemsPanelTemplate\u003e\n    \u003c/StatusBar.ItemsPanel\u003e\n \n    \u003c!-- REQUIRED: initial image resource from built in resources\n         has to be named and passed into helper.\n         Set a fixed height\n    --\u003e\n    \u003cStatusBarItem Grid.Column=\"0\" Margin=\"2,1,0,0\"\u003e\n        \u003cImage x:Name=\"StatusIcon\" Source=\"{StaticResource circle_greenDrawingImage}\" Height=\"14\" /\u003e\n    \u003c/StatusBarItem\u003e\n    \n    \u003c!-- REQUIRED: Main panel text block - has to be named and passed into the helper --\u003e\n    \u003cStatusBarItem Grid.Column=\"1\"\u003e\n        \u003cTextBlock Name=\"StatusText\"\u003eReady\u003c/TextBlock\u003e\n    \u003c/StatusBarItem\u003e\n    \n    \u003c!-- other custom layout that you can do whatever you want with --\u003e\n    \u003cStatusBarItem Grid.Column=\"2\"\u003e\n        \u003cContentControl Name=\"StatusCenter\" \n                   Margin=\"10 0\"\n                   x:FieldModifier=\"public\" HorizontalAlignment=\"Left\" /\u003e\n    \u003c/StatusBarItem\u003e\n    \u003cStatusBarItem Grid.Column=\"3\"\u003e\n        \u003cContentControl x:Name=\"StatusRight\" x:FieldModifier=\"public\" HorizontalAlignment=\"Right\" Margin=\"0 0 5 0\" /\u003e\n    \u003c/StatusBarItem\u003e\n\u003c/StatusBar\u003e\n```\n\n\u003e #### Status Bar Recommendations\n\u003e For best effect, there are a couple of recommendations for any custom status bars you use with `StatusbarHelper`:\n\u003e\n\u003e * Make the StatusBar a **fixed height** to avoid resizing on Flashing\n\u003e * Make the icon a fixed height (13-15 is good)\n\n#### Add the StatusbarHelper Instance Property\nIn the constructor of Window or Control that hosts this control you can then assign the `StatusbarHelper` as a property like this:\n\n```csharp\n public partial class MyWindow : Window\n {\n    public StatusbarHelper Status { get;  }\n\n    public MyWindow()\n    {\n        InitializeComponent();\n          \n        // Create the helper with text and icon passed in    \n        Status = new StatusbarHelper(StatusText, StatusIcon);\n        \n        ...\n    } \n }        \n```\n#### Use the Status instance\n\nTo use, you can now call the helper's methods to update the status bar:\n\n```csharp\nprivate void BtnSuccess_OnClick(object sender, RoutedEventArgs e)\n{\n    // use the controls methods - uses Default Timeout\n    Status.ShowStatusSuccess(\"Yay. The operation was successful! \");\n    \n    // shows status and resets to default  after 2 secs\n    Status.ShowStatusWarning(\"Careful... this might go sideways.\", 2000);\n\n    // shows spinning icon indefinitely\n    Status.ShowStatusProgress(\"This may take a minute...\");\n}\n```\n\n## Class Interface\nThe following provides more detail on the interfaces for the `StatusbarControl` and `StatusHelper` classes.\n\n### StatusbarControl\nThe StatusbarControl is a UserControl that contains a 3 panel `StatusBar` control. The \n\n**Properties**\n\n* **StatusbarInstance**  \nthe 4 panel WPF StatusBar instance you can optionally manipulate\n\n* **Status**  \nThe `StatusbarHelper` instance that does all the work for updating the status bar (see below).\n\n**Methods**\n\nThe control has several methods that forward the `StatusbarHelper` methods to the control (more info below).\n\n* ShowStatusSuccess()\n* ShowStatusError()\n* ShowStatusWarning()\n* ShowStatusProgress()\n\nIn addition it has two methods to set the 2 non-primary status bar panels, with content or text:\n\n* SetStatusCenter()\n* SetStatusRight()\n\n### StatusBarHelper\nThe helper provides easy to use methods to update the icon and main status text of the statusbar that it's bound to. You pass in a `TextBlock` and `Image` that map to these panel items and that are updated as needed.\n\n**Properties**\n\n* **StatusText and StatusImage**   \nThe two controls captured in the constructor that are updated by this helper.\n\n* **StatusIcons**  \nAn instance of `ItemSource` images that describe the icons that are used for display messages. Defaults to `StatusIcons.Default` but can be overridden with your own instance that replaces any of the default `ItemSource` Images. If you replace `StatusIcons` we recommend you create a **new instance** to avoid overwriting the default icons unless you want to globally replace icons.\n\n* **DefaultStatusText**  \nThe default status text that the control reverts back to when the display timeout is expired.  \n\u003csmall\u003e*Related: The default icon is reset to `StatusIcons.DefaultIcon`.*\u003c/small\u003e\n\n* **StatusMessageTimeoutMs**  \nDetermines the default message timeout in milliseconds for operations that revert to the default message and icon after the timeout (Success, Error, Warning). You can always override this setting in the individual methods.\n\n* **OriginalIconHeight and OriginalIconWidth**  \nCaptures the original icon size of the icon so that it can be reset when 'flashing' the icon. If the value is non-zero the value provided is used. If default value of 0, we attempt to capture the size from the `Image` control, and if that fails - likely because of auto-sizing - we default to 14. Preferrably you set the icon's height in the statusbar or provide at least an explicit height. If width can't be determined we use the same value as the height.\n\n**Methods** \nMethods are pretty self-explanatory:\n\n```csharp\npublic void ShowStatusSuccess(string message, int timeout = -1, \n    ImageSource imageSource = null, bool flashIcon = true)\n```\n\n```csharp\npublic void ShowStatusWarning(string message, int timeout = -1,\n    ImageSource imageSource = null,\n    bool flashIcon = true)\n```\n\n```csharp\npublic void ShowStatusWarning(string message, int timeout = -1,\n    ImageSource imageSource = null,\n    bool flashIcon = true)\n```\n\n```csharp\npublic void ShowStatusProgress(string message, int timeout = -1, \n    ImageSource imageSource = null, bool spin = true, bool flashIcon = false)\n```\n\n```csharp\npublic void ShowStatus(string message = null, \n    int timeoutMs = 0,\n    ImageSource imageSource = null,\n    bool spin = false, \n    bool flashIcon = false, \n    bool noDispatcher = false)\n```\n\n```csharp\npublic void SetStatusIcon(ImageSource imageSource, bool spin = false)\npublic void SetStatusIcon() // resets to default\n```\n\n```csharp\npublic void FlashIcon(Image icon = null)\n```\n\n#### Timeout Parameter Notes\nThe timeout parameter can be passed as a Milliseconds value, -1 or 0.\n\n* **Milliseconds** - Explicit timeout in Milliseconds\n* **-1** - Use the default `StatusMessageTimeoutMs`\n* **0** - No timeout - display the message and leave it up\n\n\n## Using Custom Icons\nThe status bar uses default icons that are internally provided via a `icons.xaml` XAML resource, but can be replaced with your own custom icons either globally, per instance or with each method call.\n\nAll icons are `ImageSource` objects, so they can be replaced with any new image source, which can come from other XAML resources, bitmap images or even from other libraries like the `FontAwesome6` library - anything that can produce an `ImageSource`.\n\n### Default Icon Configuration - how it works\nBy default the `StatusbarHelper` and `StatusbarControl` are using default icons that are embedded as XAML resources in `icons.xaml` and that are assigned as `DrawingImage` instances to the `ImageSource` typed properties of `StatusIcons`. \n\nThe default resource icons are accessible via the following resource path and resource keys:\n\nvia XAML:\n\n```xml\n\u003cWindow.Resources\u003e\n \u003c!-- local - or put this in App.xaml --\u003e\n \u003cResourceDictionary Source=\"pack://application:,,,/Westwind.Wpf.Statusbar;component/Assets/icons.xaml\" /\u003e\n\u003c/Window.Resources\u003e\n\n\u003cStatusBarItem Grid.Column=\"0\" Margin=\"2,1,0,0\"\u003e\n        \u003cImage x:Name=\"StatusIcon\" Source=\"{StaticResource circle_greenDrawingImage}\" Height=\"14\" /\u003e\n\u003c/StatusBarItem\u003e\n```\n\nor via code:\n\n```cs\npublic StatusIcons()\n{\n    var dict = new ResourceDictionary()\n    {\n        Source = new Uri(\"pack://application:,,,/Westwind.Wpf.Statusbar;component/Assets/icons.xaml\")\n    };\n    if (!Application.Current.Resources.Contains(\"circle_greenDrawingImage\"))\n        Application.Current.Resources.MergedDictionaries.Add(dict);\n\n    DefaultIcon = dict[\"circle_greenDrawingImage\"] as DrawingImage;\n    SuccessIcon = dict[\"circle_checkDrawingImage\"] as DrawingImage;\n    ErrorIcon = dict[\"triangle_exclamationDrawingImage\"] as DrawingImage;\n    WarningIcon = dict[\"triangle_warningDrawingImage\"] as DrawingImage;\n    ProgressIcon = dict[\"circle_notchDrawingImage\"] as DrawingImage;\n}\n```\n\nThese icons are exposed as the default in:\n\n```cs\nStatusbarHelper.StatusIcons = StatusbarIcons.Default;\n```\n\n### Overriding Default Icons\nThere are three ways to override the default icons:\n\n* Globally - Overide the `StatusIcon.Default` icon set\n* Per Control - Override the `StatusbarHelper.StatusIcons` instance\n* Per Call - Override the `imageSource` parameter on the various `ShowStatusXXX()` calls\n\n#### Globally override StatusIcon.Default\nThe `StatusIcon.Default` static object contains the default icons provided by this library in the `icons.xaml` resource. The default icons are the default icon set assigned to a new instance of the `StatusbarHelper` and by extension the `StatusbarControl` which uses the helper for rendering. \n\nYou can assign a new set of icons to the `StatusIcon.Default` icon `ImageSource` properties. By overriding these ImageSource properties **before any controls or helpers are created** you are effectively globally overriding the value all icons that are rendered.\n\nFor example, to override the `SuccessIcon` you could use the following code:\n\n```cs\n// ImageAwesome creates a DrawingImage control\nimage = new ImageAwesome()\n{\n    PrimaryColor = Brushes.ForestGreen,\n    Height = 15,\n    Icon = EFontAwesomeIcon.Solid_SquareCheck\n};\n\n// globally override SuccessIcon for all instance that use the default icons\nStatusIcons.Default.SuccessIcon = image.Source;\n```\n\n#### Override StatusbarHelper Instance\nIf you want to override behavior of a single `StatusbarHelper` or `StatusbarControl` you can do so via the Helper's `StatusIcons` class. You access it both directly on a `StatusbarHelper.StatusIcons` instance or on the `StatusbarControl.Status.StatusIcons` property.\n\n\nHere's an example using the [FontAwesome6 library](https://github.com/MartinTopfstedt/FontAwesome6) which among other things can create ImageSources from FontAwesome icons using the `ImageAwesome` class. Here I'm assigning to a `StatusbarControl` and it's `StatusIcons` at the control level.\n\n```csharp\nprivate void BtnToggleIcons_OnChecked(object sender, RoutedEventArgs e)\n{\n    ToggleState = !ToggleState;\n\n    if (ToggleState)\n    {\n        ActiveIconSet = \"Custom Images: Font Awesome 6\";\n\n        // You can override the control or StatusbarHelper icons\n\n        // Create and assign a NEW icon set so we don't overwrite default icons\n        var icons = new StatusIcons();\n        Statusbar.Status.StatusIcons = icons;\n        \n        // if you want to retain existing icons assign them\n        // icons.DefaultIcon = StatusIcons.Default.DefaultIcon\n\n        // create new custom icons for the error icon from FontAwesome6 icons\n        var image = new ImageAwesome()\n        {\n            PrimaryColor = Brushes.Green,\n            Height = 15,\n            Icon = EFontAwesomeIcon.Solid_House\n        };\n        icons.DefaultIcon = image.Source;\n\n        image = new ImageAwesome()\n        {\n            PrimaryColor = Brushes.ForestGreen,\n            Height = 15,\n            Icon = EFontAwesomeIcon.Solid_SquareCheck\n        };\n        icons.SuccessIcon = image.Source;\n\n        // create a custom icon for the error icon from FontAwesome6 icons\n        image = new ImageAwesome()\n        {\n            PrimaryColor = Brushes.DarkGoldenrod,\n            Height = 15,\n            Icon = EFontAwesomeIcon.Solid_CircleRadiation\n        };\n        icons.WarningIcon = image.Source;\n\n        image = new ImageAwesome()\n        {\n            PrimaryColor = Brushes.Firebrick,\n            Height = 15,\n            Icon = EFontAwesomeIcon.Solid_CircleExclamation\n        };\n        icons.ErrorIcon = image.Source;\n\n        image = new ImageAwesome()\n        {\n            PrimaryColor = Brushes.SteelBlue,\n            Height = 15,\n            Icon = EFontAwesomeIcon.Solid_Spinner\n        };\n        icons.ProgressIcon = image.Source;\n    }\n    else\n    {\n        ActiveIconSet = \"Default Xaml Icons\";\n        \n        // using the Statusbar control\n        Statusbar.Status.StatusIcons = StatusIcons.Default;\n        \n        // using the Statusbar Helper\n        // StatusHelper.StatusIcons = icons;\n    }\n\n    btnToggleIcons.Content = ActiveIconSet;\n    Statusbar.Status.SetStatusIcon();\n\n    // Alternately you can also override the StatusIcon.Default icons \n    // and have them overridden anywhere the default icons are used\n    // as a 'global' icon override:\n    //\n    // StatusbarIcons.DefaultIcon = image.Source;  // overrides anywhere the default is used\n\n}\n```\n\n#### Per call Icon Overrides\nEach of the control and helper `ShowStatusXXX()` methods have a parameter override that let you specify an `imageSource` parameter that effectively lets you use any icon you want for just a single call.\n\n```csharp\nprivate async void BtnRaw_OnClick(object sender, RoutedEventArgs e)\n{\n    var image = new ImageAwesome()\n    {\n        PrimaryColor = Brushes.SteelBlue,\n        Height = 15,\n        Icon = EFontAwesomeIcon.Solid_Spinner\n    };\n    \n    // Use the custom ImageAwesome source \n    Statusbar.Status.ShowStatusProgress(\"Custom icon spinner (from FontAwesome)\",\n                                       imageSource: image.Source, spin: true);\n}\n```\n\n## License\nThis library is published under **MIT license** terms.\n\n**Copyright \u0026copy; 2023 Rick Strahl, West Wind Technologies**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRickStrahl%2FWestwind.Wpf.Statusbar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FRickStrahl%2FWestwind.Wpf.Statusbar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRickStrahl%2FWestwind.Wpf.Statusbar/lists"}