From wpf-dev-pack
Configures ThemeInfo attribute in AssemblyInfo.cs for automatic Generic.xaml loading in WPF Custom Control Libraries. Use for new control projects or troubleshooting missing styles.
npx claudepluginhub christian289/dotnet-with-claudecode --plugin wpf-dev-packThis skill uses the workspace's default tool permissions.
Configuring the `ThemeInfo` attribute for automatic Generic.xaml loading in WPF Custom Control Library projects.
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.
Configuring the ThemeInfo attribute for automatic Generic.xaml loading in WPF Custom Control Library projects.
WPF uses the ThemeInfo attribute to locate theme-specific and generic resource dictionaries at runtime. Without this attribute, Themes/Generic.xaml will not be loaded automatically, and CustomControl styles will not be applied.
// Properties/AssemblyInfo.cs
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, // Theme-specific resources
ResourceDictionaryLocation.SourceAssembly)] // Generic resources (Themes/Generic.xaml)
YourProject/
├── Properties/
│ └── AssemblyInfo.cs ← ThemeInfo attribute here
├── Themes/
│ └── Generic.xaml ← Auto-loaded by ThemeInfo
└── CustomButton.cs
| Value | Description | Use Case |
|---|---|---|
None | No resource dictionary for this category | Theme-specific: when no OS theme customization needed |
SourceAssembly | Resources in the current assembly | Generic: load from Themes/Generic.xaml in this assembly |
ExternalAssembly | Resources in a separate assembly | When themes are packaged in YourAssembly.ThemeName.dll |
[assembly: ThemeInfo(
themeDictionaryLocation, // 1st: Theme-specific (e.g., Aero, Luna)
genericDictionaryLocation)] // 2nd: Generic fallback (Themes/Generic.xaml)
themeDictionaryLocation): OS theme-specific styles (rarely used)genericDictionaryLocation): Generic.xaml location (must be SourceAssembly)<!-- App.xaml - DO NOT DO THIS for CustomControl styles -->
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyControls;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
| Issue | Description |
|---|---|
| Not standard pattern | CustomControl styles should be loaded via ThemeInfo, not App.xaml |
| Cross-assembly failure | When another assembly references your control library, styles won't load (the consuming app doesn't have your MergedDictionary) |
| Breaks encapsulation | The control library should be self-contained; consumers shouldn't need to configure resource loading |
ThemeInfo attribute to AssemblyInfo.cs (see Section 1)Themes/Generic.xamlEvery CustomControl must set its default style key in the static constructor. This works together with ThemeInfo to locate the correct style:
public class CustomButton : Button
{
static CustomButton()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(CustomButton),
new FrameworkPropertyMetadata(typeof(CustomButton)));
}
}
How it works:
ThemeInfo tells WPF where to find Generic.xamlDefaultStyleKeyProperty tells WPF which TargetType style to applyTargetType="{x:Type local:CustomButton}"| Symptom | Cause | Fix |
|---|---|---|
| Style not applied | Missing ThemeInfo attribute | Add ThemeInfo to AssemblyInfo.cs |
| Style not applied | Wrong generic parameter | Set 2nd parameter to SourceAssembly |
| Style not applied | Missing DefaultStyleKeyProperty | Add OverrideMetadata in static constructor |
| Style not applied in other assembly | Using App.xaml MergedDictionaries instead of ThemeInfo | Switch to ThemeInfo attribute |
| Generic.xaml not found | Wrong file location | Must be in Themes/Generic.xaml (exact path) |