public/Add-WPFMenu.ps1

<#
.SYNOPSIS
Adds a context menu to a given ontrol.

.DESCRIPTION
Uses the hashtable (form -> MenuItemName={action}) to create a context menu for the given control. For convenience, the menu item's tag is set to the control.
You can get to the control in the action (i.e. event handler) using $this.Tag.

.PARAMETER Control
The control that gets the context menu

.PARAMETER Items
Hashtable. The keys in the hashtable will be the labels of the context menu items. The corresponding values should be scriptblocks that will be invoked if the menu item is clicked.

.EXAMPLE
An example

.LINK
https://msdn.microsoft.com/en-us/library/system.windows.controls.contextmenu
#>

function Add-WPFMenu {
    [CmdletBinding()]
    Param([Parameter(ValueFromPipeline = $true)]$Control,
        [Hashtable]$Items)
    process {
        $contextMenu = New-Object System.Windows.Controls.ContextMenu
        foreach ($item in $items.GetEnumerator()) {
            $menuItem = new-object System.Windows.Controls.MenuItem -property @{Header = $item.Key}
            $menuItem.Tag = $control
            $menuItem.Add_Click($item.Value)
            $contextMenu.Items.Add($menuItem) | out-null
        }
        $control.ContextMenu = $contextMenu
        $control
    }
}