EonaCat.MarkdownEditor 0.0.2

Prefix Reserved
dotnet add package EonaCat.MarkdownEditor --version 0.0.2
                    
NuGet\Install-Package EonaCat.MarkdownEditor -Version 0.0.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="EonaCat.MarkdownEditor" Version="0.0.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="EonaCat.MarkdownEditor" Version="0.0.2" />
                    
Directory.Packages.props
<PackageReference Include="EonaCat.MarkdownEditor" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add EonaCat.MarkdownEditor --version 0.0.2
                    
#r "nuget: EonaCat.MarkdownEditor, 0.0.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package EonaCat.MarkdownEditor@0.0.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=EonaCat.MarkdownEditor&version=0.0.2
                    
Install as a Cake Addin
#tool nuget:?package=EonaCat.MarkdownEditor&version=0.0.2
                    
Install as a Cake Tool

EonaCat.MarkdownEditor

A feature-rich Markdown-to-FlowDocument rendering engine and WPF viewer control for .NET. EonaCat.MarkdownEditor converts Markdown (with several GitHub/Textile-style extensions) into a native WPF FlowDocument, and ships a ready-to-use MarkdownScrollViewer control with syntax-highlighted code blocks, inline HTML, SVG images, emoticons, YAML front matter, theming, and a fully pluggable pipeline.

Installation

dotnet add package EonaCat.MarkdownEditor

Features

  • WPF Markdown viewer/editor
  • Live FlowDocument rendering
  • Markdig-based parsing
  • Syntax highlighting
  • HTML parser support
  • Tables
  • Images
  • Hyperlinks
  • Code blocks
  • Lists and task lists
  • Block quotes
  • Anchors
  • Custom commands
  • Theme support
  • Extensible parser architecture

Basic Usage

Quick start

Add the namespace and drop in the fully-featured viewer (EonaCat.MarkdownEditor.Viewer.MarkdownScrollViewer — this is the variant that enables code highlighting and inline HTML and SVG and YAML metadata):

xml<Window x:Class="MyApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:md="clr-namespace:EonaCat.MarkdownEditor.Viewer;assembly=EonaCat.MarkdownEditor" Title="Markdown demo" Height="600" Width="900">

<md:MarkdownScrollViewer x:Name="Viewer"
                          MarkdownStyleName="GithubLike"
                          ClickAction="OpenBrowser" />

</Window>

You can also set the Markdown content declaratively, right inside the XAML, using the HereMarkdown content property (indentation is automatically stripped):

xml<md:MarkdownScrollViewer MarkdownStyleName="Standard"> # Hello, world!

This is **bold**, this is *italic*, and this is `inline code`.

- Item one
- Item two
  - Nested item

</md:MarkdownScrollViewer>

Code-behind usage

csharpusing EonaCat.MarkdownEditor.Viewer;

public partial class MainWindow : Window { public MainWindow() { InitializeComponent();

    Viewer.Markdown = """
        # Release notes

        ## v0.0.1
        - Initial release
        - Added **Markdown** rendering
        - Added `code` highlighting

        > Thanks for trying EonaCat.MarkdownEditor!
        """;
}

}

Loading Markdown asynchronously (e.g. after a network/file read):

csharpvar text = await File.ReadAllTextAsync("CHANGELOG.md"); Viewer.Markdown = text;

XAML

<Window
    x:Class="MarkdownDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:markdown="clr-namespace:EonaCat.MarkdownEditor;assembly=EonaCat.MarkdownEditor">

    <Grid>

        <markdown:MarkdownEditor
            x:Name="Editor"
            Margin="10"/>

    </Grid>

</Window>

Load markdown from code:

Editor.Markdown = """
# Hello World

This is **Markdown**.

- Item 1
- Item 2
- Item 3

```csharp
Console.WriteLine("Hello");

""";


---

# MVVM Usage

```xml
<markdown:MarkdownEditor
    Markdown="{Binding Document}"
    IsReadOnly="{Binding IsReadOnly}" />
public class MainViewModel
{
    public string Document { get; set; } = File.ReadAllText("README.md");

    public bool IsReadOnly { get; set; }
}

Loading a File

Editor.Markdown = File.ReadAllText("Document.md");

Saving

File.WriteAllText("Document.md", Editor.Markdown);

Creating a New Document

Editor.Markdown = "";

Loading Embedded Resources

using var stream =
    Assembly.GetExecutingAssembly()
        .GetManifestResourceStream("MyProject.Readme.md");

using var reader = new StreamReader(stream);

Editor.Markdown = reader.ReadToEnd();

Loading from a URL

using var client = new HttpClient();

Editor.Markdown =
    await client.GetStringAsync(
        "https://raw.githubusercontent.com/user/repo/main/README.md");

Read-Only Mode

<markdown:MarkdownEditor
    IsReadOnly="True"/>

Dark Theme

<markdown:MarkdownEditor
    Theme="Dark"/>

Light Theme

<markdown:MarkdownEditor
    Theme="Light"/>

Binding to Commands

<Button
    Command="{Binding SaveCommand}"
    Content="Save"/>
SaveCommand = new RelayCommand(() =>
{
    File.WriteAllText(
        "document.md",
        Editor.Markdown);
});

Editing Programmatically

Append text

Editor.Markdown += Environment.NewLine + "New content";

Replace text

Editor.Markdown = "# New document";

Clear

Editor.Markdown = string.Empty;

Supported Markdown

Headings

# Heading 1

## Heading 2

### Heading 3

#### Heading 4

##### Heading 5

###### Heading 6

Bold

**Bold**

Italic

*Italic*

Bold Italic

***Bold Italic***

Strike-through

~~Deleted~~

Underline (HTML)

<u>Underline</u>

https://example.com

[Google](https://google.com)

Images

![Logo](Images/logo.png)

Block Quotes

> Quote
>> Nested Quote

Horizontal Rules

---

***

Bullet Lists

- One
- Two
- Three

Numbered Lists

1. One
2. Two
3. Three

Task Lists

- [x] Done

- [ ] Todo

Tables

| Name | Value |
|------|------|
| A | 1 |
| B | 2 |

Inline Code

`Console.WriteLine()`

Editor:

// Base engine only:
var basic   = new EonaCat.MarkdownEditor.Markdown();

// + code highlighting:
var withHl  = new EonaCat.MarkdownEditor.Highlighting.Markdown();

// Full feature set (recommended):
var full    = new EonaCat.MarkdownEditor.Viewer.Markdown();

Target Frameworks

  • .NET Framework 4.8
  • .NET 8 Windows

Supported Markdown

  • Headers
  • Paragraphs
  • Bold / Italic
  • Lists
  • Ordered Lists
  • Task Lists
  • Tables
  • Images
  • Links
  • HTML
  • Code Blocks
  • Block Quotes
  • Horizontal Rules

Syntax Highlighting

Supports highlighted fenced code blocks through the highlighting extensions.

HTML Support

Includes parsers for buttons, inputs, figures, details, code blocks, images, tables and more.

Extending

Create custom parsers and extensions by implementing the existing parser infrastructure.

MVVM

Quick Start

<markdown:MarkdownScrollViewer
    Markdown="{Binding Markdown}" />

Bind the Markdown dependency property directly to your ViewModel.

<markdown:MarkdownScrollViewer Markdown="{Binding Document}" />
<Window xmlns:md="clr-namespace:EonaCat.MarkdownEditor">
</Window>

XAML usage

Add the namespace and drop in the fully-featured viewer (EonaCat.MarkdownEditor.Viewer.MarkdownScrollViewer — this is the variant that enables code highlighting and inline HTML and SVG and YAML metadata):

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:md="clr-namespace:EonaCat.MarkdownEditor.Viewer;assembly=EonaCat.MarkdownEditor"
        Title="Markdown demo" Height="600" Width="900">

    <md:MarkdownScrollViewer x:Name="Viewer"
                              MarkdownStyleName="GithubLike"
                              ClickAction="OpenBrowser" />
</Window>

You can also set the Markdown content declaratively, right inside the XAML, using the HereMarkdown content property (indentation is automatically stripped):

<md:MarkdownScrollViewer MarkdownStyleName="Standard">
    # Hello, world!

    This is **bold**, this is *italic*, and this is `inline code`.

    - Item one
    - Item two
      - Nested item
</md:MarkdownScrollViewer>

Code-behind usage

using EonaCat.MarkdownEditor.Viewer;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Viewer.Markdown = """
            # Release notes

            ## v1.0.0
            - Initial release
            - Added **Markdown** rendering
            - Added `code` highlighting

            > Thanks for trying EonaCat.MarkdownEditor!
            """;
    }
}

Loading Markdown asynchronously (e.g. after a network/file read):

var text = await File.ReadAllTextAsync("CHANGELOG.md");
Viewer.Markdown = text;

Class hierarchy

The engine (Markdown) and the viewer (MarkdownScrollViewer) both come in three progressively richer flavors, each adding plugin setups on top of the previous one. Pick the namespace matching the feature set you need — or start from Viewer.* and remove plugins you don't want.

Namespace Adds on top of the base Recommended when
EonaCat.MarkdownEditor.Markdown / MarkdownScrollViewer Core Markdown only (headings, emphasis, lists, tables, quotes, rules, images, links) You want the smallest, most predictable feature set.
EonaCat.MarkdownEditor.Highlighting.Markdown / MarkdownScrollViewer SyntaxHighlightPluginSetup → syntax-highlighted fenced code blocks You render technical docs / READMEs with code samples.
EonaCat.MarkdownEditor.Viewer.Markdown / MarkdownScrollViewer MetaDataPluginSetup (YAML front matter) + HtmlPluginSetup (inline HTML) + SvgPluginSetup (SVG images), on top of syntax highlighting Default recommendation — the full feature set, used in the examples in this README.
// Base engine only:
var basic   = new EonaCat.MarkdownEditor.Markdown();

// + code highlighting:
var withHl  = new EonaCat.MarkdownEditor.Highlighting.Markdown();

// Full feature set (recommended):
var full    = new EonaCat.MarkdownEditor.Viewer.Markdown();

Each level lets you AddIfAbsent<TPluginSetup> extra setups, or assign a brand-new Plugins object if you want to compose your own subset from scratch (see The plugin system).


Markdown syntax reference

Feature Syntax Toggle (via SyntaxManager)
Headings (ATX) # H1 … ###### H6 always on
Headings (Setext) Title\n===== / Subtitle\n----- always on
Bold / Italic **bold**, *italic*, ___strict___ (with StrictBoldItalic) always on
Strikethrough ~~text~~ EnableStrikethrough
Inline code `code` always on
Fenced code block ```csharp\ncode\n``` always on (highlighting needs Highlighting.*)
Indented code block 4-space indented lines always on
Blockquote > quoted text always on
Note block < note text > EnableNoteBlock
Unordered/ordered list -, *, +, 1. (nested with indentation) classic vs. EnableListMarkerExt (adds roman numerals, letters, etc.)
Table \| Col A \| Col B \| GFM pipe tables EnableTableBlock
Horizontal rule ---, ***, ___ (extended: bold/double variants) classic vs. EnableRuleExt
Paragraph alignment p<. left, p=. center, p>. right EnableTextAlignment
Image ![alt](path "title") always on
Image with size ![alt](path){width=200px height=100px} EnableImageResizeExt — units: px,%,em,ex,mm,cm,in,pt,pc,Q
Link [text](url "title") always on
Inline HTML any of the supported tags (see below) requires Html.HtmlPluginSetup (already in Viewer.*)
SVG image ![alt](image.svg) requires Svg.SvgPluginSetup (already in Viewer.*)
Emoticon :smile:, :heart:, :thumbsup:, … always on when using Emoticons lookups in your own filter/pre-processing
YAML front matter leading ---\nkey: value\n--- block requires MetaData.MetaDataPluginSetup (already in Viewer.*)

Supported inline HTML tags

a, abbr/acronym, b/strong, bdi, br, cite, del/s/strike, em/i, ins/u, mark, sub, sup, code/kbd/var, plus block-level tags such as div, p, address, article, aside, blockquote, center, footer, h1–h6, ul/ol/li, table/thead/tbody/tr/td/th, details/summary, button, input, textarea, progress/meter, figure, hr, img, and HTML comments.

---
title: EonaCat.MarkdownEditor demo
tags: [wpf, markdown, demo]
date: 2026-07-04
---

# EonaCat.MarkdownEditor :rocket:

p=. This paragraph is centered.

## Features

- **Bold**, *italic*, ~~strikethrough~~, `inline code`
- Nested lists
  1. First
  2. Second
- Task-style progress: <progress value="70" max="100"></progress>

> A classic blockquote.

< This is a note block, rendered with the NoteStyle. >

| Language | Highlighted |
|----------|:-----------:|
| C#       | ✅ |
| Python   | ✅ |

```csharp
public class Example
{
    public void Run() => Console.WriteLine("Hello, EonaCat!");
}
```

![Logo, resized to 128px wide](./assets/logo.svg){width=128px}

Jump to the [features](#features) section.

Styling & themes

MarkdownStyle bundles six ready-made Style resources for the FlowDocument, applied via MarkdownStyleName (string) or MarkdownStyle (Style object):

<md:MarkdownScrollViewer MarkdownStyleName="GithubLike" />
Viewer.MarkdownStyle = EonaCat.MarkdownEditor.MarkdownStyle.Compact;
// or by name:
Viewer.MarkdownStyleName = nameof(EonaCat.MarkdownEditor.MarkdownStyle.Sasabune);

Available styles: Standard, Compact, GithubLike, Sasabune, SasabuneStandard, SasabuneCompact.

You can also override the style of individual element types on the Markdown engine directly (see Per-element style overrides), or supply your own Style targeting FlowDocument/Paragraph/etc. and pass it through MarkdownStyle.

Dark mode

MarkdownScrollViewer.IsDarkTheme is auto-detected from the Windows "Apps use light theme" registry setting on construction, and kept in sync automatically as the OS setting changes (SystemEvents.UserPreferenceChanged). You can also set it explicitly:

Viewer.IsDarkTheme = true; // force dark colors regardless of OS setting

Colors are applied through MarkdownThemeProperties, a set of inheritable attached properties (BackgroundColor, ForegroundColor, Heading1Color…Heading4Color, CodeForeground, CodeBackground, CodeBorderColor, BlockquoteBorderColor, NoteBackgroundColor, NoteBorderColor, LinkColor, LinkHoverColor, TableBorderColor, TableHeaderBackground, TableEvenRowBackground). Override any of them from XAML to customize a single color without replacing the whole style:

<md:MarkdownScrollViewer
    md:MarkdownThemeProperties.LinkColor="#FF00A2FF"
    md:MarkdownThemeProperties.CodeBackground="#FF1B1B1B" />

Set ClickAction on the viewer to control what happens when a link is clicked:

Viewer.ClickAction = EonaCat.MarkdownEditor.ClickAction.SafetyOpenBrowser;
ClickAction value Behavior
None No built-in handling.
OpenBrowser Opens the link with the OS shell (Process.Start).
SafetyOpenBrowser Same, but blocks known dangerous extensions (.exe, .dll, .bat, .ps1, …) and prompts for confirmation before opening local files.
DisplayWithRelativePath Loads the linked Markdown/text file into the same viewer, resolved relative to the current document.
DisplayAll Same, but resolves against the absolute path.
SafetyDisplayWithRelativePath DisplayWithRelativePath + the same dangerous-extension safety checks.
HighlightOnly Clicking does nothing except visually indicate the link was clicked (no navigation at all).

#fragment links (e.g. [Jump](#features)) are always intercepted and scrolled to in-document, regardless of ClickAction, as long as a matching heading/anchor exists.

For full control, assign a custom ICommand instead:

Viewer.HyperlinkCommand = new MyOwnLinkCommand();
Viewer.OnHyperLinkClicked = (sender, link) =>
{
    Debug.WriteLine($"Clicked: {link}");
};

Code blocks & syntax highlighting

When using Highlighting.* or Viewer.*, fenced code blocks render inside a read-only, syntax-highlighted EonaCat.Editor.TextEditor:

```csharp
Console.WriteLine("Hello!");
```

Built-in language aliases include: csharp/c#, c++, html, javascript, markdown, powershell/posh, python, tsql, boo, coco, asp/xhtml.

Registering a custom highlighting definition

using EonaCat.MarkdownEditor.Plugins;

var plugins = viewer.Plugins ?? new MarkdownEditorPlugins();
plugins.Highlights.Add(new Definition
{
    Alias = "myLang",
    RealName = "MyLang",
    Resource = new Uri("pack://application:,,,/Resources/MyLang.xshd")
});
viewer.Plugins = plugins;

Then reference it in Markdown with:

```myLang
your code here
```

Mouse-wheel scrolling inside a code block scrolls the code editor horizontally when <kbd>Shift</kbd> is held, and bubbles up to the outer scroll viewer otherwise. Each code block also gets its own Copy/Select-All context menu (disable via DisabledContextMenu).


Images (bitmap, SVG, resizing, lazy load)

  • Standard raster images (png, jpg, bmp, gif, …) load via the built-in WPF BitmapImage pipeline.
  • .svg images are handled by Svg.SvgImageLoader (included in Viewer.*), which rasterizes the SVG to a BitmapImage at its intrinsic size.
  • Large/remote images download lazily by default; disable with DisabledLazyLoad = true if you want everything loaded eagerly up-front.
  • Resize any image inline:
![diagram](diagram.png){width=400px}
![icon](icon.svg){width=32px height=32px}
![banner](banner.jpg){width=100%}

Supported size units: px, %, em, ex, mm, cm, in, pt, pc, Q.

Relative image/link paths are resolved against AssetPathRoot (defaults to Environment.CurrentDirectory, and is auto-updated whenever you Open/Source a file so that sibling assets resolve correctly).


Inline HTML support

Because Html.HtmlPluginSetup is included in Viewer.*, you can freely mix raw HTML into your Markdown — useful for things Markdown itself doesn't express well, such as collapsible sections or inline progress bars:

<details>
  <summary>Click to expand</summary>

  Hidden content goes here — **Markdown works inside too**.
</details>

<div style="text-align:center">
  <b>Centered, bold HTML block</b>
</div>

Progress: <progress value="42" max="100"></progress>

Note: enabling the HTML plugin turns off the library's own < note > block syntax (EnableNoteBlock is set to false by HtmlPluginSetup) because < starts an HTML tag in that mode.


Emoticons

The Emoticons static class exposes a large bundled shortcode → emoji table (e.g. grinning, heart_eyes, thumbsup, rocket, …), loaded from an embedded resource. Use it directly if you're writing your own pre-processing filter or inline parser:

using EonaCat.MarkdownEditor;

Emoticons.OnError += (s, ex) => Debug.WriteLine($"Emoticons failed to load: {ex}");

// look up / iterate the table as needed inside a custom IFilter or IInlineParser

YAML front matter (metadata)

When using Viewer.*, a leading YAML block is stripped from the rendered body and parsed with YamlDotNet:

---
title: My Document
author: Jeroen Saey
tags: [wpf, markdown]
---

# Body content starts here

Read the parsed metadata back off the resulting FlowDocument (or the viewer, once arranged):

using EonaCat.MarkdownEditor.MetaData;

if (MetaData.GetMetaDataDic(Viewer) is { } metadata)
{
    var title = metadata["title"];       // "My Document"
    var tags  = metadata["tags"];        // List<object> { "wpf", "markdown" }
}

In-document anchors & the Fragment/Source API

Every heading gets an automatically generated, collision-safe anchor (duplicate heading text gets -1, -2, … suffixes). Link to it from anywhere in the document:

See the [Installation](#installation) section.

Programmatically scroll to a fragment:

Viewer.Fragment = "#installation";

or bind the whole thing to a URI, including remote/http(s) and WPF pack URIs:

Viewer.Source = new Uri("https://raw.githubusercontent.com/you/repo/main/README.md");
// or:
Viewer.Source = new Uri("pack://application:,,,/Docs/readme.md");
// or a plain file:
Viewer.Source = new Uri(@"C:\Docs\readme.md");

Source supports #fragment suffixes directly (new Uri("readme.md#installation", UriKind.Relative)), and relative sources are resolved against BaseUri/AssetPathRoot.


Loading Markdown from files, resources & URLs

// Local file (relative paths are resolved against BaseUri / AssetPathRoot):
Viewer.Source = new Uri("docs/readme.md", UriKind.Relative);
Viewer.BaseUri = new Uri(AppContext.BaseDirectory);

// Embedded WPF resource:
Viewer.Source = new Uri("pack://application:,,,/Assets/readme.md");

// Remote HTTP(S) (downloaded via WebClient on net48, HttpClient on net8.0):
Viewer.Source = new Uri("https://example.com/readme.md");

// Straight from a string, no URI resolution needed:
Viewer.Markdown = "# Hello\n\nJust some **text**.";

Headless usage: Markdown engine only

You don't need the viewer control at all if you just want a FlowDocument — e.g. to print, export, or host inside your own FlowDocumentReader/RichTextBox-like surface:

using EonaCat.MarkdownEditor.Viewer; // full feature set

var engine = new Markdown();
FlowDocument document = engine.Transform("# Hello\n\nSome **Markdown** text.");

myFlowDocumentReader.Document = document;

Configure the engine before transforming:

engine.StrictBoldItalic   = false;   // require _x_ / __x__ style rather than *_x_* leniency
engine.DisabledTag        = false;   // keep semantic Tag values (Heading1, Bold, ...) on generated elements
engine.DisabledTooltip    = false;
engine.DisabledLazyLoad   = true;
engine.AssetPathRoot      = @"C:\MyDocs\assets";
engine.Heading1Style      = (Style)FindResource("MyH1Style");

The plugin system (extensibility)

Everything the library does — beyond the hard-coded CommonMark-ish core — is wired up through MarkdownEditorPlugins, a mutable, observable bag of extension points:

public class MarkdownEditorPlugins
{
    public SyntaxManager Syntax { get; }                                  // on/off toggles for built-in syntax extensions
    public ObservableCollection<IPluginSetup> Setups { get; }             // bundles of the below, applied on add
    public ObservableCollection<IFilter> Filters { get; }                 // pre-processors (e.g. YAML front matter)
    public ObservableCollection<IBlockParser> TopBlock { get; }           // top-level block parsers (e.g. inline HTML blocks)
    public ObservableCollection<IBlockParser> Block { get; }              // nested/sub block parsers
    public ObservableCollection<IInlineParser> Inline { get; }            // inline span parsers
    public ObservableCollection<IImageLoader> ImageLoader { get; }        // e.g. SVG
    public ObservableCollection<IElementLoader> ElementLoader { get; }
    public ObservableCollection<ICodeBlockLoader> CodeBlockLoader { get; }// e.g. syntax-highlighted code editor
    public ObservableCollection<Definition> Highlights { get; }          // custom language highlighting definitions
    public ObservableCollection<IStyleOverwriter> StyleOverwriter { get; }
    public ObservableCollection<IViewerArranger> ViewerArranger { get; }  // post-render hook, e.g. attach YAML metadata
}

Assign a MarkdownEditorPlugins instance to Viewer.Plugins (or Engine.Plugins on the headless engine) to fully customize the pipeline, or add individual pieces to an existing set:

var plugins = Viewer.Plugins ?? new MarkdownEditorPlugins();
plugins.Syntax.EnableTableBlock = false;      // turn a built-in syntax feature off
plugins.Filters.Add(new MyLoggingFilter());   // add a custom pre-processor
Viewer.Plugins = plugins;

SyntaxManager also ships three presets you can start from:

plugins.Syntax.And(SyntaxManager.Plain);           // strip almost everything back to plain CommonMark-ish text
plugins.Syntax.And(SyntaxManager.Standard);         // tables + strikethrough, nothing else extended
plugins.Syntax.And(SyntaxManager.MarkdownEditor);   // everything on (the default)

Custom IFilter

Filters run before Markdown parsing and can pre-process the raw text (as MetaDataFilter does for YAML front matter):

using EonaCat.MarkdownEditor.Plugins;
using System.Windows.Documents;

public class UpperCaseHeadingsFilter : IFilter
{
    public FlowDocument DoFilter(string markdownText, IConversion next)
    {
        // Inspect/modify markdownText here, then hand off to the rest of the pipeline:
        return next.DoConversion(markdownText);
    }
}

plugins.Filters.Add(new UpperCaseHeadingsFilter());

Custom IBlockParser / IInlineParser

Add entirely new block- or inline-level Markdown syntax using BlockParser.New / InlineParser.New with your own Regex and evaluator delegate, then register it on plugins.TopBlock, plugins.Block, or plugins.Inline.

Custom IImageLoader

using EonaCat.MarkdownEditor.Plugins;
using System.Windows.Media.Imaging;

public class MyFormatImageLoader : IImageLoader
{
    public BitmapImage? Load(Stream stream)
    {
        // decode `stream` into a BitmapImage for e.g. a proprietary image format
        return null;
    }
}

plugins.ImageLoader.Add(new MyFormatImageLoader());

Custom ICodeBlockLoader

Implement ICodeBlockLoader to replace the code-block rendering entirely (e.g. to use a different code editor control), or call Register(Definition) to add highlighting definitions to the existing one.

Custom IStyleOverwriter

using EonaCat.MarkdownEditor.Plugins;
using System.Windows;

public class CompactSpacingOverwriter : IStyleOverwriter
{
    public Style Overwrite(Style style)
    {
        // Return a derived Style (e.g. BasedOn = style) with tweaks applied.
        return style;
    }
}

plugins.StyleOverwriter.Add(new CompactSpacingOverwriter());

Custom IViewerArranger

Runs after the FlowDocument is generated and attached to the viewer — useful for post-processing hooks like attaching computed metadata (this is exactly how YAML front matter reaches the viewer):

using EonaCat.MarkdownEditor.Plugins;
using System.Windows.Controls;
using System.Windows.Documents;

public class WordCountArranger : IViewerArranger
{
    public void Arrange(Control viewer, FlowDocument document)
    {
        // e.g. compute and store a word count somewhere accessible to your app
    }

    public void ResetArrange(Control viewer) { /* clean up if needed */ }
}

plugins.ViewerArranger.Add(new WordCountArranger());

Per-element style overrides

The Markdown engine exposes a Style? property per element kind, letting you override individual pieces without replacing the whole document style:

Viewer.Engine.Heading1Style      = (Style)FindResource("BigBlueHeading");
Viewer.Engine.CodeBlockStyle     = (Style)FindResource("DarkCodeBlock");
Viewer.Engine.BlockquoteStyle    = (Style)FindResource("SubtleQuote");
Viewer.Engine.TableHeaderStyle   = (Style)FindResource("StripedHeader");
Viewer.Engine.NoteStyle          = (Style)FindResource("CalloutNote");

Available style hooks: DocumentStyle, Heading1Style…Heading6Style, NormalParagraphStyle, CodeStyle, CodeBlockStyle, BlockquoteStyle, LinkStyle, ImageStyle, SeparatorStyle, TableStyle, TableHeaderStyle, TableBodyStyle, NoteStyle.


API reference (most-used members)

MarkdownScrollViewer (all three namespace variants share this surface)

Member Type Description
Markdown string The Markdown source to render.
HereMarkdown string Same as Markdown, but designed for inline XAML content with automatic indent-stripping.
MarkdownStyle / MarkdownStyleName Style / string The document style to apply.
Syntax SyntaxVersion (Plain/Standard/MarkdownEditor) Coarse syntax preset.
ClickAction ClickAction What happens when a hyperlink is clicked.
HyperlinkCommand ICommand Custom link-click command (used when ClickAction doesn't cover your case).
OnHyperLinkClicked HyperLinkClickCallback Callback fired on link click.
Source / Fragment Uri / string Load content from a URI and/or scroll to an in-document fragment.
AssetPathRoot string Base path used to resolve relative images/links.
BaseUri Uri Base URI used to resolve relative Source values.
IsDarkTheme bool Current theme; auto-detected, but settable.
DisabledLazyLoad bool Disable lazy image loading.
Plugins MarkdownEditorPlugins The active plugin pipeline.
Engine Markdown The underlying conversion engine (for per-element style overrides, etc.).

Markdown (engine)

Member Description
Transform(string text) Converts Markdown text to a FlowDocument.
StrictBoldItalic Require unambiguous **bold**/*italic* delimiters.
DisabledTag / DisabledTooltip / DisabledContextMenu Toggle auxiliary behaviors on generated elements.
Plugins The plugin pipeline (block/inline parsers, filters, loaders, etc.).
Heading1Style…NoteStyle Per-element style overrides.

Enums

public enum ClickAction { None, OpenBrowser, DisplayWithRelativePath, DisplayAll, SafetyOpenBrowser, SafetyDisplayWithRelativePath, HighlightOnly }
public enum SyntaxVersion { Plain, Standard, MarkdownEditor }

Emoji Reference

Emoji Name
😀 grinning
😃 grinning_face_with_big_eyes
😄 grinning_face_with_smiling_eyes
😁 beaming_face_with_smiling_eyes
😆 grinning_squinting_face
😅 grinning_face_with_sweat
🤣 rolling_on_the_floor_laughing
😂 face_with_tears_of_joy
🙂 slightly_smiling_face
🙃 upside_down_face
😉 winking_face
😊 smiling_face_with_smiling_eyes
😇 innocent
🥰 smiling_face_with_hearts
😍 smiling_face_with_heart_eyes
🤩 star_struck
😘 face_blowing_a_kiss
😗 kissing_face
☺️ smiling_face
😚 kissing_face_with_closed_eyes
😙 kissing_face_with_smiling_eyes
🥲 smiling_face_with_tear
😋 face_savoring_food
😛 face_with_tongue
😜 winking_face_with_tongue
🤪 zany_face
😝 squinting_face_with_tongue
🤑 money_mouth_face
🤗 face_with_hands
🤭 face_with_hand_over_mouth
🫢 face_with_open_eyes_and_hand_over_mouth
🫣 face_with_peeking_eye
🤫 shushing_face
🤔 thinking_face
🫡 saluting_face
🤐 zipper_mouth_face
🤨 face_with_raised_eyebrow
😐 neutral_face
😑 expressionless_face
😶 face_without_mouth
🫥 dotted_line_face
😶‍🌫️ face_in_clouds
😒 unamused_face
🙄 face_with_rolling_eyes
😬 grimacing_face
😮‍💨 face_exhaling
😔 pensive_face
😪 sleepy_face
🤤 drooling_face
😴 sleeping_face
😷 face_with_medical_mask
🤒 face_with_thermometer
🤕 face_with_head_bandage
🤢 nauseated_face
🤮 face_vomiting
🤧 sneezing_face
🥵 hot_face
🥶 cold_face
🥴 woozy_face
😵 dizzy_face
😵‍💫 face_with_spiral_eyes
🤯 exploding_head
😕 confused_face
🫤 face_with_diagonal_mouth
😟 worried_face
🙁 slightly_frowning_face
☹️ frowning_face
😮 face_with_open_mouth
😯 hushed_face
😲 astonished_face
😳 flushed_face
🥺 pleading_face
😦 frowning_face_with_open_mouth
😧 anguished_face
😨 fearful_face
😰 anxious_face_with_sweat
😥 sad_but_relieved_face
😢 crying_face
😭 loudly_crying_face
😱 face_screaming_in_fear
😖 confounded_face
😣 persevering_face
😞 disappointed_face
😓 downcast_face_with_sweat
😩 weary_face
😫 tired_face
🥱 yawning_face
😤 face_with_steam_from_nose
😡 pouting_face
😠 angry_face
🤬 face_with_symbols_on_mouth
💀 skull
☠️ skull_and_crossbones
👻 ghost
💩 pile_of_poo
🤡 clown_face
👽 alien
👾 alien_monster
🤖 robot
🎃 jack_o_lantern
👍 thumbs_up
👎 thumbs_down
👌 ok_hand
🤌 finger_pinched
🤏 pinching_hand
✌️ victory_hand
🤞 crossed_fingers
🤟 love_you_gesture
🤘 sign_of_the_horns
🤙 call_me_hand
👈 backhand_index_pointing_left
👉 backhand_index_pointing_right
👆 backhand_index_pointing_up
👇 backhand_index_pointing_down
☝️ index_pointing_up
✋ raised_hand
🤚 raised_back_of_hand
🖐 hand_with_fingers_splayed
✊ raised_fist
👊 oncoming_fist
🤛 left_facing_fist
🤜 right_facing_fist
👏 clapping_hands
🙌 raising_hands
👐 open_hands
🤝 handshake
🙏 folded_hands
❤️ red_heart
🧡 orange_heart
💛 yellow_heart
💚 green_heart
💙 blue_heart
💜 purple_heart
🖤 black_heart
🤍 white_heart
🤎 brown_heart
💔 broken_heart
❣️ heart_exclamation
💕 two_hearts
💞 revolving_hearts
💓 beating_heart
💗 growing_heart
💖 sparkling_heart
💘 heart_with_arrow
💝 heart_with_ribbon
💟 heart_decoration
🐶 dog_face
🐕 dog
🐕‍🦺 service_dog
🐩 poodle
🐺 wolf
🦊 fox
🦝 raccoon
🐱 cat_face
🐈 cat
🐈‍⬛ black_cat
🦁 lion
🐯 tiger_face
🐅 tiger
🐆 leopard
🐴 horse
🐎 horse_racing
🦄 unicorn
🦓 zebra
🦌 deer
🐮 cow_face
🐄 cow
🐂 ox
🐃 water_buffalo
🐷 pig_face
🐖 pig
🐗 boar
🐽 pig_nose
🐏 ram
🐑 ewe
🐐 goat
🐪 camel
🐫 two_hump_camel
🦙 llama
🦒 giraffe
🐘 elephant
🦣 mammoth
🦏 rhinoceros
🦛 hippopotamus
🐭 mouse_face
🐁 mouse
🐀 rat
🐹 hamster
🐰 rabbit_face
🐇 rabbit
🐿 squirrel
🐦 bird
🐧 penguin
🕊 dove
🦅 eagle
🦆 duck
🦢 swan
🦉 owl
🦜 parrot
🐔 chicken
🐓 rooster
🐣 hatching_chick
🐤 baby_chick
🐥 front_facing_baby_chick
🐸 frog
🐊 crocodile
🐢 turtle
🦎 lizard
🐍 snake
🐲 dragon_face
🐉 dragon
🐟 fish
🐠 tropical_fish
🐡 blowfish
🦈 shark
🐙 octopus
🦑 squid
🦐 shrimp
🦞 lobster
🦀 crab
🐚 shell
🐝 honeybee
🐛 bug
🦋 butterfly
🐌 snail
🐞 lady_beetle
🐜 ant
🪲 beetle
🪳 cockroach
🕷 spider
🕸 spider_web
🌵 cactus
🎄 christmas_tree
🌲 evergreen_tree
🌳 deciduous_tree
🌴 palm_tree
🌱 seedling
🌿 herb
☘️ shamrock
🍀 four_leaf_clover
🍁 maple_leaf
🍂 fallen_leaf
🍃 leaf_fluttering_in_wind
🌺 hibiscus
🌻 sunflower
🌹 rose
🌷 tulip
🌼 blossom
🌸 cherry_blossom
💐 bouquet
🌍 earth_africa
🌎 earth_americas
🌏 earth_asia
🌑 new_moon
🌒 waxing_crescent_moon
🌓 first_quarter_moon
🌔 waxing_gibbous_moon
🌕 full_moon
🌖 waning_gibbous_moon
🌗 last_quarter_moon
🌘 waning_crescent_moon
🌙 crescent_moon
🌚 new_moon_face
🌞 sun_face
☀️ sun
🌤 sun_behind_small_cloud
⛅ sun_behind_cloud
🌥 sun_behind_large_cloud
☁️ cloud
🌧 cloud_with_rain
⛈ cloud_with_lightning_and_rain
🌩 cloud_with_lightning
🌨 cloud_with_snow
🌪 tornado
🌈 rainbow
⚡ high_voltage
❄️ snowflake
🔥 fire
💧 droplet
🌊 water_wave
🍎 red_apple
🍏 green_apple
🍐 pear
🍊 tangerine
🍋 lemon
🍌 banana
🍉 watermelon
🍇 grapes
🍓 strawberry
🫐 blueberries
🍈 melon
🍒 cherries
🍑 peach
🥭 mango
🍍 pineapple
🥥 coconut
🥝 kiwi_fruit
🥑 avocado
🍆 eggplant
🥔 potato
🥕 carrot
🌽 corn
🌶 hot_pepper
🫑 bell_pepper
🥒 cucumber
🥬 leafy_green
🥦 broccoli
🧄 garlic
🧅 onion
🍄 mushroom
🥜 peanuts
🌰 chestnut
🍞 bread
🥐 croissant
🥖 baguette
🥨 pretzel
🫓 flatbread
🥯 bagel
🌮 taco_shell
🌯 burrito
🥪 sandwich
🥙 stuffed_flatbread
🍗 poultry_leg
🍖 meat_on_bone
🥩 cut_of_meat
🥓 bacon
🍔 burger
🌭 hot_dog
🍕 pizza
🍟 french_fries
🍤 fried_shrimp
🍳 cooking_egg
🍱 bento_box
🍘 rice_cracker
🍙 rice_ball
🍚 cooked_rice
🍛 curry_rice
🍜 ramen
🍝 spaghetti
🍠 roasted_sweet_potato
🍲 stew
🍢 oden
🍣 sushi
🍤 tempura_shrimp
🍥 fish_cake
🥘 paella
🍲 soup
🍦 ice_cream
🍧 shaved_ice
🍨 ice_cream_bowl
🍩 doughnut
🍪 cookie
🎂 birthday_cake
🍰 shortcake
🧁 cupcake
🍫 chocolate_bar
🍬 candy
🍭 lollipop
🍮 custard
☕ hot_beverage
🫖 teapot
🍵 tea
🥛 milk
🧃 juice_box
🥤 cup_with_straw
🍺 beer
🍻 beers
🍷 wine_glass
🥂 clinking_glasses
🍸 cocktail
🍹 tropical_drink
🥃 tumbler_glass
🍾 bottle_with_popping_cork
🍼 baby_bottle
🍴 fork_and_knife
🥄 spoon
🔪 kitchen_knife
🍽 plate_with_cutlery
🥢 chopsticks
🍯 honey_pot
🧂 salt
🫒 olive
🧈 butter
🧀 cheese
🥚 egg
🚗 car
🚕 taxi
🚙 sport_utility_vehicle
🚌 bus
🚎 trolleybus
🏎 racing_car
🚓 police_car
🚑 ambulance
🚒 fire_engine
🚐 minibus
🚚 delivery_truck
🚛 articulated_lorry
🚜 tractor
🛻 pickup_truck
🚲 bicycle
🛴 kick_scooter
🛵 motor_scooter
🏍 motorcycle
🚨 police_light
🚂 steam_locomotive
🚆 train
🚇 metro
🚈 light_rail
🚉 station
🚊 tram
🚝 monorail
🚞 mountain_railway
✈️ airplane
🛩 small_airplane
🛫 airplane_departure
🛬 airplane_arrival
🚀 rocket
🛰 satellite
🚁 helicopter
🛸 ufo
🚢 ship
⛴ ferry
🛥 motor_boat
🚤 speedboat
⛵ sailboat
🛶 canoe
🏠 house
🏡 house_with_garden
🏘 houses
🏚 derelict_house
🏗 building_construction
🏢 office_building
🏣 japanese_post_office
🏤 post_office
🏥 hospital
🏦 bank
🏨 hotel
🏪 convenience_store
🏫 school
🏬 department_store
🏭 factory
🏯 japanese_castle
🏰 castle
🗼 tokyo_tower
🗽 statue_of_liberty
⛪ church
🕌 mosque
🛕 hindu_temple
🕍 synagogue
🌍 earth_africa
🌎 earth_americas
🌏 earth_asia
🗺 world_map
🧭 compass
🏔 snow_capped_mountain
⛰ mountain
🌋 volcano
🗻 mount_fuji
🏕 camping
🏖 beach_with_umbrella
🏜 desert
🏝 desert_island
🚦 vertical_traffic_light
🚥 horizontal_traffic_light
🚧 construction
🛑 stop_sign
⚠️ warning
⛔ no_entry
🚫 prohibited
🚳 no_bicycles
🚭 no_smoking
🚯 no_littering
🚸 children_crossing
📍 round_pushpin
📌 pushpin
📎 paperclip
🧭 compass
🗺 map
📱 mobile_phone
📲 mobile_phone_with_arrow
☎️ telephone
📞 telephone_receiver
📟 pager
📠 fax_machine
📺 television
📻 radio
📡 satellite_antenna
📷 camera
📸 camera_flash
🎥 movie_camera
🎬 clapper_board
🎤 microphone
🎧 headphones
📢 loudspeaker
🔊 speaker_high_volume
🔉 speaker_medium_volume
🔈 speaker_low_volume
🔇 muted_speaker
📶 antenna_bars
📳 vibration_mode
📴 mobile_phone_off
💻 laptop
🖥 desktop_computer
🖨 printer
⌨️ keyboard
🖱 computer_mouse
💽 minidisc
💾 floppy_disk
💿 optical_disk
📀 dvd
🧮 abacus
🖲 trackball
💡 light_bulb
🔌 electric_plug
🔋 battery
🪫 low_battery
🔦 flashlight
🧰 toolbox
🧲 magnet
💰 money_bag
💴 yen_banknote
💵 dollar_banknote
💶 euro_banknote
💷 pound_banknote
💸 money_with_wings
💳 credit_card
🧾 receipt
🏧 atm_sign
💱 currency_exchange
💲 dollar_sign
📁 file_folder
📂 open_file_folder
🗂 card_index_dividers
📅 calendar
📆 tear_off_calendar
🗓 spiral_calendar
📇 card_index
📈 upwards_chart
📉 downwards_chart
📊 bar_chart
🗃 card_file_box
🗄 file_cabinet
📋 clipboard
📌 pushpin
📍 round_pushpin
📎 paperclip
🖇 linked_paperclips
📏 ruler
📐 triangular_ruler
✂️ scissors
🖊 pen
🖋 fountain_pen
🖌 paintbrush
🖍 crayon
📝 memo
📑 bookmark_tabs
📄 page
📃 page_with_curl
📜 scroll
📔 notebook
📕 closed_book
📖 open_book
📗 green_book
📘 blue_book
📙 orange_book
📚 books
📓 notebook
📒 ledger
🔒 locked
🔓 unlocked
🔏 locked_with_pen
🔐 locked_with_key
🗝 old_key
🛡 shield
🚨 police_light
⚠️ warning
⛔ no_entry
🚫 forbidden
🚷 no_pedestrians
🚯 no_littering
🚳 no_bicycles
🚭 no_smoking
🚱 non_potable_water
🔞 no_under_18
📵 no_mobile_phones
⚙️ gear
🧭 compass
⏰ alarm_clock
⏲ timer_clock
⏱ stopwatch
⌚ watch
⏳ hourglass
⌛ empty_hourglass
🕹 joystick
🎛 control_knobs
🎚 volume_slider
🔋 battery
🔌 power_plug
💡 bulb
🔦 torch
🧯 fire_extinguisher
🪛 screwdriver
🔧 wrench
🔨 hammer
🪚 wood_saw
⚒ hammer_and_pick
🛠 tools
🌐 globe_with_meridians
🕸 spider_web
🛰 satellite
📡 satellite_antenna
📶 antenna_bars
📳 vibration_mode
📴 mobile_phone_off
📱 mobile_phone
💻 laptop
🖥 desktop_computer
🖨 printer
🧭 compass
🔗 link
📎 paperclip
🧷 safety_pin
📥 inbox_tray
📤 outbox_tray
📨 incoming_envelope
📩 envelope_with_arrow
📧 e_mail
✉️ envelope
📬 open_mailbox_with_mail
📭 open_mailbox_with_no_mail
📫 closed_mailbox_with_raised_flag
📪 closed_mailbox_with_lowered_flag
🚗 automobile
🚕 taxi
🚙 sport_utility_vehicle
🚌 bus
🚎 trolleybus
🚓 police_car
🚑 ambulance
🚒 fire_engine
🚐 minibus
🚚 delivery_truck
🚛 articulated_lorry
🚜 tractor
🚲 bicycle
🛵 motor_scooter
🏍 motorcycle
🚨 police_light
🚥 traffic_light_horizontal
🚦 traffic_light_vertical
🚧 construction
🚏 bus_stop
🛣 motorway
🛤 railway_track
🚆 train
🚇 metro
🚈 light_rail
🚉 station
🚊 tram
🚝 monorail
🚞 mountain_railway
🚋 tram_car
🚃 railway_car
🚢 ship
⛴ ferry
🛳 passenger_ship
✈️ airplane
🛩 small_airplane
🚀 rocket
🛰 satellite
🚁 helicopter
⛵ sailboat
🚤 speedboat
🏠 house
🏡 house_with_garden
🏢 office_building
🏣 japanese_post_office
🏤 european_post_office
🏥 hospital
🏦 bank
🏨 hotel
🏫 school
🏬 department_store
🏭 factory
🏯 japanese_castle
🏰 european_castle
⛪ church
🕌 mosque
🛕 hindu_temple
🕍 synagogue
🏟 stadium
🎡 ferris_wheel
🎢 roller_coaster
🎠 carousel_horse
🏗 construction_site
🏚 derelict_house
🏜 desert
🏝 desert_island
🏞 national_park
🌇 sunset_cityscape
🌆 night_cityscape
🌃 night_with_stars
🌉 bridge_at_night
🌁 foggy
🎉 party_popper
🎊 confetti_ball
🎈 balloon
🎁 gift
🎀 ribbon
🎗 reminder_ribbon
🏆 trophy
🥇 1st_place_medal
🥈 2nd_place_medal
🥉 3rd_place_medal
🎯 direct_hit
🎮 video_game
🕹 joystick
🎲 game_die
🎰 slot_machine
🎳 bowling
🎣 fishing_pole
🎤 microphone
🎧 headphones
🎼 musical_score
🎹 musical_keyboard
🎷 saxophone
🎺 trumpet
🎸 guitar
🎻 violin
🥁 drum
🎬 clapper_board
🎭 performing_arts
🎨 artist_palette
☀️ sun
🌤 sun_behind_small_cloud
⛅ partly_sunny
🌥 sun_behind_large_cloud
🌦 sun_behind_rain_cloud
🌧 rain_cloud
⛈ thunder_cloud_rain
🌩 cloud_lightning
❄️ snowflake
☃️ snowman
⛄ snowman_without_snow
🌬 wind_face
💨 dashing_away
🌪 tornado
🌈 rainbow
🔥 fire
💧 droplet
🌊 water_wave
🌫 fog
❤️ red_heart
💔 broken_heart
💕 two_hearts
💖 sparkling_heart
💗 growing_heart
💘 heart_with_arrow
💝 heart_with_ribbon
💞 revolving_hearts
💟 heart_decoration
❣️ heart_exclamation
💯 hundred_points
✔️ check_mark
☑️ check_box
❌ cross_mark
❎ cross_mark_button
⚠️ warning
🚫 prohibited
⛔ no_entry
🔞 no_one_under_eighteen
♻️ recycling
♿ wheelchair_symbol
⚜️ fleur_de_lis
〽️ part_alternation_mark
⚛️ atom_symbol
✡️ star_of_david
☸️ dharma_wheel
☯️ yin_yang
✝️ latin_cross
☦️ orthodox_cross
☮️ peace_symbol
🕉 om_symbol
🔯 six_pointed_star
🔺 red_triangle_up
🔻 red_triangle_down
🔷 blue_diamond
🔶 orange_diamond
🔸 small_orange_diamond
🔹 small_blue_diamond
▪️ black_small_square
▫️ white_small_square
◼️ black_medium_square
◻️ white_medium_square
⬛ black_large_square
⬜ white_large_square
🔳 white_square_button
🔲 black_square_button
🧪 test_tube
🧫 petri_dish
🧬 dna
⚗️ alembic
🔬 microscope
🔭 telescope
💉 syringe
💊 pill
🩺 stethoscope
🩹 adhesive_bandage
🩼 crutch
🦠 microbe
🧠 brain
🫀 heart_anatomical
🫁 lungs
🦴 bone
🦷 tooth
⚕️ medical_symbol
👶 baby
🧒 child
👦 boy
👧 girl
🧑 adult
👨 man
👩 woman
🧓 older_adult
👴 older_man
👵 older_woman
👨‍👩‍👧 family_man_woman_girl
👨‍👩‍👦 family_man_woman_boy
👨‍👩‍👧‍👦 family_complete
👨‍👨‍👦 family_two_men_boy
👩‍👩‍👧 family_two_women_girl
👨‍👨‍👧‍👦 family_two_men_complete
👩‍👩‍👧‍👦 family_two_women_complete
🏳️ white_flag
🏴 black_flag
🏁 checkered_flag
🚩 triangular_flag
🏳️‍🌈 rainbow_flag
🏴‍☠️ pirate_flag
🇺🇸 flag_united_states
🇬🇧 flag_united_kingdom
🇩🇪 flag_germany
🇫🇷 flag_france
🇮🇹 flag_italy
🇪🇸 flag_spain
🇯🇵 flag_japan
🇰🇷 flag_south_korea
🇨🇳 flag_china
🇳🇱 flag_netherlands
⌚ watch
📿 prayer_beads
🧿 nazar_amulet
🎯 dart_board
🎲 game_die
🎰 slot_machine
🧩 puzzle_piece
🪀 yo_yo
🪁 kite
🪄 magic_wand
🪅 pinata
🪆 nesting_dolls
🔑 key
🗝 old_key
🔒 locked
🔓 unlocked
🛡 shield
⚙️ gear
🔧 wrench
🔨 hammer
🪛 screwdriver
🧲 magnet
🪚 saw
👨‍⚕️ doctor_man
👩‍⚕️ doctor_woman
🧑‍⚕️ health_worker
👨‍🎓 student_man
👩‍🎓 student_woman
🧑‍🎓 graduate
👨‍🏫 teacher_man
👩‍🏫 teacher_woman
🧑‍🏫 instructor
👨‍💻 developer_man
👩‍💻 developer_woman
🧑‍💻 coder
👨‍🔧 mechanic_man
👩‍🔧 mechanic_woman
🧑‍🔧 technician
👨‍🔬 scientist_man
👩‍🔬 scientist_woman
🧑‍🔬 researcher
👨‍🎨 artist_man
👩‍🎨 artist_woman
🧑‍🎨 artist
👨‍🚒 firefighter_man
👩‍🚒 firefighter_woman
🧑‍🚒 firefighter
👨‍✈️ pilot_man
👩‍✈️ pilot_woman
🧑‍✈️ pilot
👨‍⚖️ judge_man
👩‍⚖️ judge_woman
🧑‍⚖️ judge
👮‍♂️ police_man
👮‍♀️ police_woman
🧑‍✈️ police_officer
🥐 croissant
🥯 bagel
🥞 pancakes
🧇 waffle
🥓 bacon
🍳 cooking
🥚 egg
🧈 butter
🧀 cheese
🥗 salad
🍲 stew
🍛 curry_rice
🍜 ramen
🍝 spaghetti
🍣 sushi
🍤 fried_shrimp
🍙 rice_ball
🍘 rice_cracker
🍚 cooked_rice
🍧 shaved_ice
🍨 ice_cream
🍦 soft_ice_cream
🍰 shortcake
🎂 birthday_cake
🍫 chocolate
🍬 candy
🍭 lollipop
🍮 custard
☕ coffee
🍵 green_tea
🧃 juice_box
🥤 cup_with_straw
🍺 beer
🍷 wine
🥂 clinking_glasses
🇦🇩 flag_andorra
🇦🇪 flag_united_arab_emirates
🇦🇫 flag_afghanistan
🇦🇱 flag_albania
🇦🇲 flag_armenia
🇦🇷 flag_argentina
🇦🇹 flag_austria
🇦🇺 flag_australia
🇧🇪 flag_belgium
🇧🇷 flag_brazil
🇨🇦 flag_canada
🇨🇭 flag_switzerland
🇨🇱 flag_chile
🇨🇴 flag_colombia
🇩🇰 flag_denmark
🇪🇬 flag_egypt
🇫🇮 flag_finland
🇬🇷 flag_greece
🇭🇺 flag_hungary
🇮🇳 flag_india
🇮🇪 flag_ireland
🇮🇸 flag_iceland
🇮🇱 flag_israel
🇲🇽 flag_mexico
🇳🇴 flag_norway
🇳🇿 flag_new_zealand
🇵🇱 flag_poland
🇵🇹 flag_portugal
🇷🇴 flag_romania
🇸🇪 flag_sweden
🇹🇷 flag_turkey
🇺🇦 flag_ukraine
🇺🇸 flag_united_states
🇬🇧 flag_united_kingdom
🇿🇦 flag_south_africa
👍🏻 thumbs_up_light_skin
👍🏼 thumbs_up_medium_light_skin
👍🏽 thumbs_up_medium_skin
👍🏾 thumbs_up_medium_dark_skin
👍🏿 thumbs_up_dark_skin
👋🏻 wave_light_skin
👋🏼 wave_medium_light_skin
👋🏽 wave_medium_skin
👋🏾 wave_medium_dark_skin
👋🏿 wave_dark_skin

and more

Product Compatible and additional computed target framework versions.
.NET net8.0-windows7.0 is compatible.  net9.0-windows was computed.  net10.0-windows was computed. 
.NET Framework net48 is compatible.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.0.2 150 7/4/2026
0.0.1 117 7/4/2026