From wpf-dev-pack
Creates WPF dialog windows including modal dialogs, MessageBox, custom settings dialogs, and common dialogs for confirmation prompts, settings windows, file/folder pickers.
npx claudepluginhub christian289/dotnet-with-claudecode --plugin wpf-dev-packThis skill uses the workspace's default tool permissions.
> **MVVM Framework Rule**: `.claude/rules/dotnet/wpf/mvvm-framework.md` 설정에 따라 코드 스타일이 결정됩니다.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
MVVM Framework Rule:
.claude/rules/dotnet/wpf/mvvm-framework.md설정에 따라 코드 스타일이 결정됩니다. Prism 9 사용 시 → PRISM.md 참조
Creating and managing dialog windows for user interaction.
Advanced Patterns: See ADVANCED.md for MVVM dialog service, modeless dialogs, and input dialogs.
Dialog Types
├── Modal Dialogs (ShowDialog)
│ ├── Custom Window dialogs
│ └── MessageBox
├── Modeless Dialogs (Show)
│ └── Tool windows, floating panels
└── Common Dialogs
├── OpenFileDialog
├── SaveFileDialog
└── FolderBrowserDialog
// Simple message
MessageBox.Show("Operation completed successfully.");
// With title
MessageBox.Show("File saved.", "Success");
// With buttons
var result = MessageBox.Show(
"Do you want to save changes?",
"Confirm",
MessageBoxButton.YesNoCancel);
// With icon
MessageBox.Show(
"An error occurred.",
"Error",
MessageBoxButton.OK,
MessageBoxImage.Error);
Buttons:
| Value | Buttons |
|---|---|
| OK | OK |
| OKCancel | OK, Cancel |
| YesNo | Yes, No |
| YesNoCancel | Yes, No, Cancel |
Icons:
| Value | Icon |
|---|---|
| None | No icon |
| Information | Info circle |
| Warning | Warning triangle |
| Error | Red X |
var result = MessageBox.Show(
"Are you sure you want to delete this item?",
"Confirm Delete",
MessageBoxButton.YesNo,
MessageBoxImage.Warning,
MessageBoxResult.No); // Default button
switch (result)
{
case MessageBoxResult.Yes:
DeleteItem();
break;
case MessageBoxResult.No:
// Cancelled
break;
}
<Window x:Class="MyApp.Dialogs.SettingsDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Settings"
Width="400" Height="300"
WindowStartupLocation="CenterOwner"
ResizeMode="NoResize"
ShowInTaskbar="False">
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Content -->
<StackPanel Grid.Row="0">
<Label Content="User Name:"/>
<TextBox x:Name="UserNameTextBox" Margin="0,5,0,15"/>
<CheckBox x:Name="EnableNotificationsCheckBox"
Content="Enable notifications"/>
</StackPanel>
<!-- Dialog buttons -->
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="OK" Width="80" Margin="0,0,10,0"
Click="OkButton_Click" IsDefault="True"/>
<Button Content="Cancel" Width="80"
Click="CancelButton_Click" IsCancel="True"/>
</StackPanel>
</Grid>
</Window>
namespace MyApp.Dialogs;
using System.Windows;
public partial class SettingsDialog : Window
{
public string UserName { get; private set; } = string.Empty;
public bool EnableNotifications { get; private set; }
public SettingsDialog()
{
InitializeComponent();
}
private void OkButton_Click(object sender, RoutedEventArgs e)
{
// Validate input
if (string.IsNullOrWhiteSpace(UserNameTextBox.Text))
{
MessageBox.Show("Please enter a user name.", "Validation Error",
MessageBoxButton.OK, MessageBoxImage.Warning);
UserNameTextBox.Focus();
return;
}
// Set results
UserName = UserNameTextBox.Text;
EnableNotifications = EnableNotificationsCheckBox.IsChecked ?? false;
// Close with success
DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
}
}
private void OpenSettings_Click(object sender, RoutedEventArgs e)
{
var dialog = new SettingsDialog
{
Owner = this // Set owner for centering
};
if (dialog.ShowDialog() == true)
{
// User clicked OK
_currentUserName = dialog.UserName;
_enableNotifications = dialog.EnableNotifications;
ApplySettings();
}
}
using Microsoft.Win32;
private void OpenFile_Click(object sender, RoutedEventArgs e)
{
var dialog = new OpenFileDialog
{
Title = "Open File",
Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*",
FilterIndex = 1,
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
Multiselect = false,
CheckFileExists = true
};
if (dialog.ShowDialog() == true)
{
var filePath = dialog.FileName;
LoadFile(filePath);
}
}
// Multiple file selection
private void OpenMultipleFiles_Click(object sender, RoutedEventArgs e)
{
var dialog = new OpenFileDialog
{
Multiselect = true,
Filter = "Image files (*.png;*.jpg)|*.png;*.jpg"
};
if (dialog.ShowDialog() == true)
{
foreach (var file in dialog.FileNames)
{
ProcessFile(file);
}
}
}
using Microsoft.Win32;
private void SaveFile_Click(object sender, RoutedEventArgs e)
{
var dialog = new SaveFileDialog
{
Title = "Save File",
Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*",
FileName = "document.txt",
DefaultExt = ".txt",
AddExtension = true,
OverwritePrompt = true
};
if (dialog.ShowDialog() == true)
{
var filePath = dialog.FileName;
SaveFile(filePath);
}
}
// .NET 8+ includes OpenFolderDialog
private void SelectFolder_Click(object sender, RoutedEventArgs e)
{
var dialog = new OpenFolderDialog
{
Title = "Select Output Folder",
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
};
if (dialog.ShowDialog() == true)
{
var folderPath = dialog.FolderName;
ProcessFolder(folderPath);
}
}