PsUi
1.1.0
WPF toolkit for PowerShell. DSL-based controls, async execution, theming. No XAML.
Minimum PowerShell version
5.1
Installation Options
Owners
Copyright
(c) 2026 Jacob LaBonte. All rights reserved.
Package Details
Author(s)
- Jacob LaBonte
Tags
GUI Windows WPF Dialog DataGrid DSL Theme Async
Cmdlets
Functions
Add-UiDataGridItem Add-UiListItem Clear-UiDataGridItems Clear-UiList Clear-UiStatus Get-PsUiIcon Get-PsUiIconFont Get-PsUiIconList Get-UiListItems Get-UiThemeTemplate Get-UiValue Hide-UiStatusBar Invoke-UiAsync New-UiAction New-UiActionCard New-UiButton New-UiButtonCard New-UiCard New-UiChart New-UiChildWindow New-UiCredential New-UiDataGrid New-UiDatePicker New-UiDropdown New-UiDropdownButton New-UiExpander New-UiGlyph New-UiGrid New-UiImage New-UiInput New-UiLabel New-UiLink New-UiList New-UiPanel New-UiProgress New-UiRadioGroup New-UiSeparator New-UiSlider New-UiSpacer New-UiStatusBar New-UiTab New-UiTextArea New-UiTimePicker New-UiToggle New-UiTool New-UiTree New-UiWebView Out-CSVDataGrid Out-Datagrid Out-TextEditor Register-UiHotkey Register-UiTheme Remove-UiListItem Reset-UiSession Set-PsUiIconFont Set-UiDataGridItems Set-UiProgress Set-UiStatusBar Set-UiValue Show-UiChoiceDialog Show-UiConfirmDialog Show-UiCredentialDialog Show-UiDialog Show-UiFilePicker Show-UiFolderPicker Show-UiGlyphBrowser Show-UiInputDialog Show-UiMessageDialog Show-UiOuPicker Show-UiPromptDialog Show-UiSaveDialog Show-UiStatusBar Show-WindowsObjectPicker Stop-UiAsync Test-PsUiIcon Update-UiChart Write-Status Write-UiHostDirect
PSEditions
Dependencies
This module has no dependencies.
Release Notes
Version 1.1.0:
- DataGrid overhaul: New-UiDataGrid as an embeddable grid, cell-embedded Button/Toggle/Link
controls, opt-in editing, RowDetailsTemplate, RowBackground, FrozenColumns, EmptyMessage,
RowContextMenu, SanitizeFormulas. Add-/Set-/Clear-UiDataGridItems helpers for mutating
the backing collection from button actions.
- -ItemsSource binds your variable: pass a bare ArrayList / List / ObservableCollection and
PsUi wraps it in a thread-safe observable wrapper, then rebinds the caller's variable so
$list.Add() lands in the grid without [ref] ceremony. -NoBind opts out.
- Status bar suite: New-UiStatusBar + companion functions. -Intercept routes Write-Warning
and Write-Error to badge counters; -AutoProgress embeds a progress bar driven by
Write-Progress; -CaptureHost routes Write-Host to status text. Severity tinting with
indicator glyphs; popup detail views on the badge counts.
- Icon font picker: Set-PsUiIconFont / Test-PsUiIcon. Pick Segoe MDL2 Assets or Segoe Fluent
Icons per session or per window. Auto-detect, fallback chain, 125 new Fluent-modern names
in CharList.json.
- New-UiTree: -ParentCheckBoxes and -ChildCheckBoxes for AD-style pickers, cascade defaults
on, -NoCascade opts out, -WhenEnabled / -Checked for per-item rules.
- -Fill on data controls and New-UiGrid (replacing -FillParent; legacy alias kept).
- New-UiTool: UserPicker, GroupPicker, MemberPicker, OUPicker helpers; -HelperOptions connects
helper buttons to other controls; helper-button errors surface in themed dialogs.
- Out-TextEditor / Out-CSVDataGrid theme inheritance fix (standalone calls no longer flip
the parent window's theme).
- AsyncObservableCollection: cross-thread reentrancy fix, second-window dispatcher fix,
seed-from-IEnumerable constructors, AttachMirror for two-way collection sync.
- net452 target alongside net472 and net6.0-windows for WinPE / older Windows.
- New-UiWindow -Theme Auto is now the default (follows the system light/dark preference).
Version 1.0.4:
- PsUi.psm1: Import-Module -Force no longer wipes static state out from under live windows
- New-UiTree: dotted property paths (e.g. 'Manager.Name') now walk into child objects instead
of being read as one literal property name (also IdProperty, PathProperty, DisplayProperty)
- New-UiTree: path-mode parent nodes carry a stand-in tag so click handlers always have
something to read; gets promoted to the real item if a matching piped item arrives later
- New-UiTree: replaced broken Get-Process help example with one that works on PS 5.1 and 7+
- Dropped dead VirtualizingPanel setters from the tree style
Version 1.0.3:
- Fix -EnabledWhen dispatcher error on TextBox/PasswordBox controls (GitHub #3)
- Fix tab content clipping when content overflows the window height
- Auto-size windows now scroll properly when MaxHeight is reached
Version 1.0.2:
- Add -EnabledWhen to 6 controls (Button, Input, TextArea, Dropdown, Tab, Action)
- New-UiTextArea: -ReadOnly switch
- Batch variable injection for faster window startup
Version 1.0.1:
- New-UiButton: -ScrollToTop switch for controlling post-completion scroll position
- New-UiTool: Detect missing help files in PS 7+, offer online docs fallback
- Show-UiFilterBuilder: Fix combobox vertical centering
- CI: Add Pester test workflow
FileList
- PsUi.nuspec
- lib\net452\PsUi.pdb
- private\Controls\Add-UiDataGridFrozenColumnAccent.ps1
- private\Controls\Get-ControlConditionValue.ps1
- private\Controls\New-ColumnVisibilityPopup.ps1
- private\Controls\Resolve-HelperOptions.ps1
- private\output\Add-DataGridColumns.ps1
- private\output\New-ErrorsTab.ps1
- private\session\Initialize-UiSession.ps1
- private\styles\Set-RadioButtonStyle.ps1
- private\theme\Register-UiThemeElement.ps1
- public\controls\Clear-UiStatus.ps1
- public\controls\New-UiSeparator.ps1
- public\dialogs\Show-UiFilePicker.ps1
- public\list\Clear-UiDataGridItems.ps1
- public\session\Reset-UiSession.ps1
- PsUi.psd1
- private\charts\Add-BarChartElements.ps1
- private\Controls\Add-UiDataGridRowBackground.ps1
- private\Controls\Get-CustomLogoIcon.ps1
- private\Controls\New-DataGridContextMenu.ps1
- private\Controls\Resolve-HelperOptionValue.ps1
- private\output\Add-DictionaryValuePopupHandler.ps1
- private\output\New-ExpandableValueColumn.ps1
- private\session\Invoke-UiContent.ps1
- private\styles\Set-SliderStyle.ps1
- private\theme\Reset-BrushCache.ps1
- public\controls\Get-UiValue.ps1
- public\controls\New-UiSlider.ps1
- public\dialogs\Show-UiFolderPicker.ps1
- public\list\Clear-UiList.ps1
- public\session\Set-PsUiIconFont.ps1
- PsUi.psm1
- private\charts\Add-ChartAxisLabels.ps1
- private\Controls\Add-UiDataGridRowContextMenuItems.ps1
- private\Controls\Get-IconDynamicParameter.ps1
- private\Controls\New-PasswordInputWithPeek.ps1
- private\Controls\Resolve-UiStatusBar.ps1
- private\output\Add-ErrorDetailsPanel.ps1
- private\output\New-FilterBoxWithClear.ps1
- private\session\Push-UiIconFontOverride.ps1
- private\styles\Set-StatusBarChildCompact.ps1
- private\theme\Set-ActiveTheme.ps1
- public\controls\Hide-UiStatusBar.ps1
- public\controls\New-UiStatusBar.ps1
- public\dialogs\Show-UiGlyphBrowser.ps1
- public\list\Get-UiListItems.ps1
- public\session\Stop-UiAsync.ps1
- .vscode\PSScriptAnalyzerSettings.psd1
- private\charts\Add-ChartYAxisTicks.ps1
- private\Controls\Add-UiDataGridRowDetails.ps1
- private\Controls\Get-PopulatedProperties.ps1
- private\Controls\New-StatusBarBadge.ps1
- private\Controls\Set-FullWidthConstraint.ps1
- private\output\Add-InputProviders.ps1
- private\output\New-ObjectSubTab.ps1
- private\session\Register-UiControl.ps1
- private\styles\Set-StatusBarChildLayout.ps1
- private\theme\Set-UIResources.ps1
- public\controls\New-UiAction.ps1
- public\controls\New-UiTextArea.ps1
- public\dialogs\Show-UiInputDialog.ps1
- public\list\New-UiDataGrid.ps1
- public\session\Test-PsUiIcon.ps1
- private\README.md
- private\charts\Add-LineChartElements.ps1
- private\Controls\Add-UiDataGridSearchText.ps1
- private\Controls\Get-UiDataGridCheckBoxStyle.ps1
- private\Controls\New-StatusBarMessagePopup.ps1
- private\Controls\Set-LastDataColumnStar.ps1
- private\output\Add-MultiTypeFilterControls.ps1
- private\output\New-OutputWindow.ps1
- private\session\Register-UiControlComplete.ps1
- private\styles\Set-StatusBarSeverityVisual.ps1
- private\theme\Set-UiTheme.ps1
- public\controls\New-UiButton.ps1
- public\controls\New-UiTimePicker.ps1
- public\dialogs\Show-UiMessageDialog.ps1
- public\list\New-UiList.ps1
- public\tool\New-UiTool.ps1
- public\README.md
- private\charts\Add-PieChartElements.ps1
- private\Controls\Add-UiDataGridStarResizeUnlock.ps1
- private\Controls\Get-UiDataGridEmptyCellHatchBrush.ps1
- private\Controls\New-TaskbarOverlayIcon.ps1
- private\Controls\Set-ResponsiveConstraints.ps1
- private\output\Add-OutputLine.ps1
- private\output\New-ProgressPanel.ps1
- private\session\Set-UiDialogPosition.ps1
- private\styles\Set-StatusBarStyle.ps1
- private\theme\ThemeDefinitions.ps1
- public\controls\New-UiChart.ps1
- public\controls\New-UiToggle.ps1
- public\dialogs\Show-UiOuPicker.ps1
- public\list\New-UiTree.ps1
- public\window\New-UiChildWindow.ps1
- resources\CharList.json
- private\charts\ConvertTo-ChartData.ps1
- private\Controls\Build-UiDataGridColumns.ps1
- private\Controls\Get-UiDataGridTextEditorStyle.ps1
- private\Controls\New-UiDataGridCellControlColumn.ps1
- private\Controls\Set-TextBoxInputFilter.ps1
- private\output\Add-ResultActionClickHandlers.ps1
- private\output\New-ResultsToolbar.ps1
- private\session\Set-WindowOwner.ps1
- private\styles\Set-TabControlStyle.ps1
- private\theme\Update-AllControlThemes.ps1
- public\controls\New-UiCredential.ps1
- public\controls\New-UiWebView.ps1
- public\dialogs\Show-UiPromptDialog.ps1
- public\list\Remove-UiListItem.ps1
- resources\xaml\styles\ButtonStyle.xaml
- resources\README.md
- private\charts\Get-ChartPalette.ps1
- private\Controls\Close-UiParentWindow.ps1
- private\Controls\Get-UiDataGridVisibleColumnPaths.ps1
- private\Controls\New-UiDataGridFilterController.ps1
- private\Controls\Set-UiFillParentHeight.ps1
- private\output\Add-TextResultsFilter.ps1
- private\output\New-SelectedRowForegroundTrigger.ps1
- private\styles\New-TextBoxContextMenu.ps1
- private\styles\Set-TabItemStyle.ps1
- private\theme\Update-SingleControlTheme.ps1
- public\controls\New-UiDatePicker.ps1
- public\controls\Register-UiHotkey.ps1
- public\dialogs\Show-UiSaveDialog.ps1
- public\list\Set-UiDataGridItems.ps1
- resources\xaml\styles\ComboBoxStyle.xaml
- lib\core\Microsoft.Web.WebView2.Core.dll
- private\charts\Invoke-ChartRedraw.ps1
- private\Controls\Complete-UiControlSetup.ps1
- private\Controls\Get-UiGridFloodWarning.ps1
- private\Controls\New-UiDataGridTextColumn.ps1
- private\Controls\Set-UiFormControlTag.ps1
- private\output\ConvertTo-DisplayValue.ps1
- private\output\New-StatusIndicator.ps1
- private\styles\Set-ButtonStyle.ps1
- private\styles\Set-TextBoxStyle.ps1
- private\theme\Update-StatusBarTheme.ps1
- public\controls\New-UiDropdown.ps1
- public\controls\Set-UiProgress.ps1
- public\dialogs\Show-WindowsObjectPicker.ps1
- public\output\Out-CSVDataGrid.ps1
- resources\xaml\styles\CommonStyles.xaml
- lib\core\Microsoft.Web.WebView2.Wpf.dll
- private\charts\New-ChartLegend.ps1
- private\Controls\Convert-UiDataGridBoolColumnsToGlyph.ps1
- private\Controls\Initialize-UiWindowLoaded.ps1
- private\Controls\New-UiDataGridToolbar.ps1
- private\Controls\Set-UiProperties.ps1
- private\output\ConvertTo-SafeDataArray.ps1
- private\output\New-StyledDataGrid.ps1
- private\styles\Set-CheckBoxStyle.ps1
- private\theme\ConvertTo-UiBrush.ps1
- private\uitool\Clear-UiToolParameters.ps1
- public\controls\New-UiDropdownButton.ps1
- public\controls\Set-UiStatusBar.ps1
- public\layout\New-UiActionCard.ps1
- public\output\Out-Datagrid.ps1
- resources\xaml\styles\ContextMenuStyle.xaml
- lib\core\PsUi.dll
- private\charts\New-ChartPieSlice.ps1
- private\Controls\ConvertTo-FormattedTextBlock.ps1
- private\Controls\Invoke-OnUIThread.ps1
- private\Controls\New-UiDataGridToolbarIconButton.ps1
- private\Controls\Show-UiHelperError.ps1
- private\output\Find-ConsoleText.ps1
- private\output\New-TextDisplayRichTextBox.ps1
- private\styles\Set-ComboBoxStyle.ps1
- private\theme\Get-ContrastColor.ps1
- private\uitool\Get-UiDefinition.ps1
- public\controls\New-UiExpander.ps1
- public\controls\Set-UiValue.ps1
- public\layout\New-UiButtonCard.ps1
- public\output\Out-TextEditor.ps1
- resources\xaml\styles\DataGridStyle.xaml
- lib\core\WebView2Loader.dll
- private\charts\Set-ChartShapeFill.ps1
- private\Controls\ConvertTo-NormalizedKeyCombo.ps1
- private\Controls\Invoke-UiAction.ps1
- private\Controls\New-UiIconButton.ps1
- private\Controls\Start-UiButtonFeedback.ps1
- private\output\Get-CleanTypeName.ps1
- private\output\New-WarningsTabFull.ps1
- private\styles\Set-ContextMenuStyle.ps1
- private\theme\Get-ControlChildren.ps1
- private\uitool\Initialize-UiToolParameters.ps1
- public\controls\New-UiGlyph.ps1
- public\controls\Show-UiStatusBar.ps1
- public\layout\New-UiCard.ps1
- public\output\Write-UiHostDirect.ps1
- resources\xaml\styles\DatePickerStyle.xaml
- lib\core\WebView2Loader.x86.dll
- private\Controls\Add-StatusBarAutoWiring.ps1
- private\Controls\ConvertTo-UiDataGridLength.ps1
- private\Controls\Invoke-UiDataGridCopyToClipboard.ps1
- private\Controls\New-UiLoadingSpinner.ps1
- private\Controls\Start-UIFadeIn.ps1
- private\output\Get-ConsoleColorBrushMap.ps1
- private\output\Register-VariableHydration.ps1
- private\styles\Set-DataGridStyle.ps1
- private\theme\Get-SeverityBrushKey.ps1
- private\uitool\Invoke-UiToolAction.ps1
- public\controls\New-UiImage.ps1
- public\controls\Update-UiChart.ps1
- public\layout\New-UiGrid.ps1
- public\session\Get-PsUiIcon.ps1
- resources\xaml\styles\GroupBoxStyle.xaml
- lib\desktop\Microsoft.Web.WebView2.Core.dll
- private\Controls\Add-StatusBarHistoryEntry.ps1
- private\Controls\ConvertTo-UiDataGridSnapshot.ps1
- private\Controls\Invoke-UiDataGridExportToCsv.ps1
- private\Controls\New-UniqueControlName.ps1
- private\Controls\Test-IconFont.ps1
- private\output\Get-OutputPresenter.ps1
- private\output\Show-StreamingOutput.ps1
- private\styles\Set-DatePickerStyle.ps1
- private\theme\Get-SystemThemePreference.ps1
- private\uitool\Invoke-UiToolValidation.ps1
- public\controls\New-UiInput.ps1
- public\controls\Write-Status.ps1
- public\layout\New-UiPanel.ps1
- public\session\Get-PsUiIconFont.ps1
- resources\xaml\styles\ScrollBarStyle.xaml
- lib\desktop\Microsoft.Web.WebView2.Wpf.dll
- private\Controls\Add-UiDataGridAlternatingBrush.ps1
- private\Controls\ConvertTo-UiFileAction.ps1
- private\Controls\Invoke-UiHelperPicker.ps1
- private\Controls\New-WindowIcon.ps1
- private\Controls\Test-UiDataGridOwned.ps1
- private\output\Get-RawConsoleColorBrushMap.ps1
- private\output\Show-UiOutput.ps1
- private\styles\Set-GroupBoxStyle.ps1
- private\theme\Get-ThemeColors.ps1
- private\uitool\Show-UiFilterBuilder.ps1
- public\controls\New-UiLabel.ps1
- public\dialogs\Show-UiChoiceDialog.ps1
- public\layout\New-UiSpacer.ps1
- public\session\Get-PsUiIconList.ps1
- resources\xaml\styles\SliderStyle.xaml
- lib\desktop\PsUi.dll
- private\Controls\Add-UiDataGridDefaultSort.ps1
- private\Controls\ConvertTo-WpfKey.ps1
- private\Controls\Invoke-UiHotkeyAction.ps1
- private\Controls\Register-ScriptBlockCondition.ps1
- private\dialogs\New-DialogWindow.ps1
- private\output\Invoke-OnCompleteHandler.ps1
- private\session\Assert-UiSession.ps1
- private\styles\Set-ListBoxStyle.ps1
- private\theme\Get-UiTheme.ps1
- private\uitool\Show-UiPathPicker.ps1
- public\controls\New-UiLink.ps1
- public\dialogs\Show-UiConfirmDialog.ps1
- public\layout\New-UiTab.ps1
- public\session\Get-UiThemeTemplate.ps1
- resources\xaml\styles\TabControlStyle.xaml
- lib\desktop\WebView2Loader.dll
- private\Controls\Add-UiDataGridEditHandling.ps1
- private\Controls\ConvertTo-WpfValue.ps1
- private\Controls\Invoke-UiOuPickerOrPrompt.ps1
- private\Controls\Register-SingleControlCondition.ps1
- private\dialogs\Show-ModernFolderPicker.ps1
- private\output\New-ConsoleTabFull.ps1
- private\session\Clear-UiSession.ps1
- private\styles\Set-MenuItemStyle.ps1
- private\theme\Initialize-UITheme.ps1
- private\uitool\Show-UiToolHelp.ps1
- public\controls\New-UiProgress.ps1
- public\dialogs\Show-UiCredentialDialog.ps1
- public\list\Add-UiDataGridItem.ps1
- public\session\Invoke-UiAsync.ps1
- resources\xaml\styles\TextBoxStyle.xaml
- lib\desktop\WebView2Loader.x86.dll
- private\Controls\Add-UiDataGridEmptyCellDecorator.ps1
- private\Controls\Format-PickerObjectResult.ps1
- private\Controls\New-ActionDropdownButton.ps1
- private\Controls\Register-UiCondition.ps1
- private\dialogs\Show-SimpleFolderPicker.ps1
- private\output\New-DictionarySubTab.ps1
- private\session\Get-UiActionContext.ps1
- private\styles\Set-ProgressBarStyle.ps1
- private\theme\New-ThemePopupButton.ps1
- private\uitool\Update-UiToolRunButtonState.ps1
- public\controls\New-UiRadioGroup.ps1
- public\dialogs\Show-UiDialog.ps1
- public\list\Add-UiListItem.ps1
- public\session\Register-UiTheme.ps1
- resources\xaml\Themes\SharedStyles.xaml
- lib\net452\PsUi.dll
- private\Controls\Add-UiDataGridEmptyOverlay.ps1
- private\Controls\Format-UiDataGridExportRows.ps1
- private\Controls\New-ClearTargetAction.ps1
- private\Controls\Reset-StatusBarBadges.ps1
- private\output\Add-ArrayCellPopupHandler.ps1
- private\output\New-ErrorDisplayRecord.ps1
- private\session\Get-UiSession.ps1