make-wpf-usercontrol — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited make-wpf-usercontrol (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
If `$0` is empty, use the AskUserQuestion tool to ask: "Enter the UserControl name (e.g., SearchBox, UserProfile)". Do NOT proceed until a valid name is provided. Use the response as the ControlName for all subsequent steps.
Generate a $0Control UserControl with XAML and code-behind. If --with-viewmodel is appended, also generate a corresponding ViewModel.
{Namespace} with the project's root namespace detected from csproj or existing code.{Project} with the target project path.# Basic UserControl
/wpf-dev-pack:make-wpf-usercontrol SearchBox
# With ViewModel
/wpf-dev-pack:make-wpf-usercontrol UserProfile --with-viewmodel<UserControl x:Class="{Namespace}.Controls.$0Control"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="100" d:DesignWidth="300">
<Grid>
<!-- TODO: Add your UI elements here -->
</Grid>
</UserControl>namespace {Namespace}.Controls;
/// <summary>
/// $0 UserControl.
/// </summary>
public partial class $0Control : UserControl
{
#region Dependency Properties
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register(
nameof(Header),
typeof(string),
typeof($0Control),
new PropertyMetadata(string.Empty));
/// <summary>
/// Gets or sets the header text.
/// </summary>
public string Header
{
get => (string)GetValue(HeaderProperty);
set => SetValue(HeaderProperty, value);
}
#endregion
public $0Control()
{
InitializeComponent();
}
}$0ControlViewModel.cs
namespace {Namespace}.ViewModels;
public partial class $0ControlViewModel : ObservableObject
{
[ObservableProperty] private string _title = string.Empty;
[RelayCommand]
private void Submit()
{
// TODO: Implement submit logic
}
}$0Control.xaml (with ViewModel)
No inline runtime `DataContext`. Inline<UserControl.DataContext>(and code-behindDataContext = new …) is prohibited (P-001-c). Declare a design-timed:DataContextfor IntelliSense only; the runtime DataContext is supplied by the composition root — the parent passes the VM, or aMappings.xamlDataTemplateresolves this control as the View for$0ControlViewModel(ViewModel First). This matchesmake-wpf-viewmodel.
<UserControl x:Class="{Namespace}.Controls.$0Control"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:{Namespace}.ViewModels"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=vm:$0ControlViewModel}">
<Grid>
<TextBlock Text="{Binding Title}"/>
</Grid>
</UserControl>| Aspect | UserControl | CustomControl |
|---|---|---|
| Purpose | Reuse within specific app | Library distribution |
| Styling | Limited | Full ControlTemplate replacement |
| Complexity | Low | High |
| Creation | XAML + Code-behind | Class + Generic.xaml |
{Project}/
├── Controls/
│ ├── $0Control.xaml
│ └── $0Control.xaml.cs
└── ViewModels/
└── $0ControlViewModel.cs (with --with-viewmodel option)Use DependencyProperty to receive external bindings in UserControl:
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register(
nameof(Value),
typeof(string),
typeof($0Control),
new FrameworkPropertyMetadata(
string.Empty,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
OnValueChanged));
public string Value
{
get => (string)GetValue(ValueProperty);
set => SetValue(ValueProperty, value);
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is $0Control control)
{
// Handle value change
}
}<!-- Usage example -->
<local:$0Control Value="{Binding MyValue, Mode=TwoWay}"/>~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.