Public/New-AnyBoxButton.ps1

function New-AnyBoxButton
{
    [cmdletbinding()]
    param(
        [string]$Text,
        [string]$Name,
        [string]$ToolTip,
        [switch]$IsCancel,
        [switch]$IsDefault,
        [System.Management.Automation.ScriptBlock]$OnClick,
        [ValidateSet($null, 'ExploreGrid', 'SaveGrid', 'CopyMessage')]
        [string]$Template
    )

    if ($Name -and $Name -notmatch '^[A-Za-z_]+[A-Za-z0-9_]*$') {
        Write-Warning "Name ($Name) must start with a letter or the underscore character (_), and must contain only letters, digits, or underscores."
        $Name = $null
    }

    $b = New-Object AnyBox.Button

    if ($Template)
    {
        $b.Name = $Template
        switch ($Template)
        {
            'ExploreGrid' {
                $b.Text = 'Explore'
                $b.ToolTip = 'Explore data in a separate grid window.'
                $b.OnClick = {
                    if ($form['data_grid']) {
                        $form['data_grid'].Items | Select-Object * | Out-GridView -Title 'Data'
                    }
                }
                break
            }
            'SaveGrid' {
                $b.Text = 'Save'
                $b.ToolTip = 'Save data to a CSV file.'
                $b.OnClick = {
                    if ($form['data_grid']) {
                        try {
                            $savWin = New-Object Microsoft.Win32.SaveFileDialog
                            $savWin.InitialDirectory = "$env:USERPROFILE\Desktop"
                            $savWin.FileName = 'data.csv'
                            $savWin.Filter = 'CSV File (*.csv)|*.csv'
                            $savWin.OverwritePrompt = $true
                            if ($savWin.ShowDialog()) {
                                $form['data_grid'].Items | Export-Csv -Path $savWin.FileName -NoTypeInformation -Encoding ASCII -Force
                                Start-Process -FilePath $savWin.FileName
                            }
                        }
                        catch {
                            $null = Show-AnyBox @childWinParams -Message $_.Exception.Message -Buttons 'OK'
                        }
                    }
                }
                break
            }
            'CopyMessage' {
                $b.Text = 'Copy'
                $b.ToolTip = 'Copy message to clipboard'
                $b.OnClick = {
                    try {
                        if (-not $form['Message'].Text) {
                            $null = Show-AnyBox @childWinParams -Message 'There is no message to copy.' -Buttons 'OK'
                        }
                        else {
                            [System.Windows.Clipboard]::SetDataObject($form['Message'].Text, $true)
                            $null = Show-AnyBox @childWinParams -Message 'Successfully copied message to clipboard.' -Buttons 'OK'
                        }
                    }
                    catch {
                        $err_msg = "Error accessing clipboard:{0}{1}" -f [Environment]::NewLine, $_.Exception.Message
                        $null = Show-AnyBox @childWinParams -Message $err_msg -Buttons 'OK'
                    }
                }
                break
            }
        }
    }

    if ($Name) { $b.Name = $Name }
    if ($Text) { $b.Text = $Text }
    if ($ToolTip) { $b.ToolTip = $ToolTip }
    if ($OnClick) { $b.OnClick = $OnClick }
    $b.IsCancel = $IsCancel -as [bool]
    $b.IsDefault = $IsDefault -as [bool]

    return($b)
}

Set-Alias -Name 'New-Button' -Value 'New-AnyBoxButton' -Description 'New-AnyBoxButton' -Scope 'Global'