108 lines
7.5 KiB
Markdown
108 lines
7.5 KiB
Markdown
|
|
---
|
||
|
|
source_files:
|
||
|
|
- DataPRO/CustomWindow/WindowMaximizeButton.cs
|
||
|
|
- DataPRO/CustomWindow/WindowRestoreButton.cs
|
||
|
|
- DataPRO/CustomWindow/WindowCloseButton.cs
|
||
|
|
- DataPRO/CustomWindow/WindowMinimizeButton.cs
|
||
|
|
- DataPRO/CustomWindow/Others.cs
|
||
|
|
- DataPRO/CustomWindow/WindowButton.xaml.cs
|
||
|
|
generated_at: "2026-04-16T03:48:20.453815+00:00"
|
||
|
|
model: "Qwen/Qwen3-Coder-Next-FP8"
|
||
|
|
schema_version: 1
|
||
|
|
sha256: "606b672d4fe748f9"
|
||
|
|
---
|
||
|
|
|
||
|
|
# CustomWindow Module Documentation
|
||
|
|
|
||
|
|
## 1. Purpose
|
||
|
|
This module provides specialized button controls for window caption/title bar operations (minimize, maximize/restore, close) in a WPF custom window implementation. It extends the standard `Button` class to support state-dependent iconography (normal vs. disabled states) and integrates with external XAML resources for visual assets. The module enables consistent, reusable UI components for non-standard window chrome, particularly in applications like DataPRO where standard window borders are replaced with custom-drawn title bars.
|
||
|
|
|
||
|
|
## 2. Public Interface
|
||
|
|
|
||
|
|
### Classes (all public, non-abstract, inherit from `System.Windows.Controls.Button`):
|
||
|
|
|
||
|
|
- **`WindowButton`**
|
||
|
|
*Base class for all window caption buttons.*
|
||
|
|
- `public new object Content { get; set; }`
|
||
|
|
Overrides `Button.Content`; sets the icon displayed when the button is enabled. Triggers `RefreshContent()` on change.
|
||
|
|
- `public object ContentDisabled { get; set; }`
|
||
|
|
Sets the icon displayed when the button is disabled. Triggers `RefreshContent()` on change.
|
||
|
|
- `public CornerRadius CornerRadius { get; set; }`
|
||
|
|
Gets/sets the corner radius of the button (default: `new CornerRadius()`).
|
||
|
|
- `public object ActiveContent { get; set; }`
|
||
|
|
Gets/sets the *current* content displayed (resolved from `Content` or `ContentDisabled` based on `IsEnabled`).
|
||
|
|
- `public virtual Brush BackgroundDefaultValue { get; }`
|
||
|
|
Returns the default background brush (resolved via `FindResource("DefaultBackgroundBrush")`).
|
||
|
|
- `protected void RefreshContent()`
|
||
|
|
Updates `ActiveContent` to `Content` if `IsEnabled` is true, otherwise to `ContentDisabled`. Automatically invoked on `IsEnabledChanged`.
|
||
|
|
|
||
|
|
- **`WindowMinimizeButton`**
|
||
|
|
*Button for window minimize functionality.*
|
||
|
|
- `public WindowMinimizeButton()`
|
||
|
|
Constructor. Loads `WindowButtonMinimizeIcon` and `WindowButtonMinimizeIconDisabled` from `ButtonIcons.xaml` into `Content` and `ContentDisabled`, respectively.
|
||
|
|
|
||
|
|
- **`WindowMaximizeButton`**
|
||
|
|
*Button for window maximize functionality.*
|
||
|
|
- `public WindowMaximizeButton()`
|
||
|
|
Constructor. Loads `WindowButtonMaximizeIcon` and `WindowButtonMaximizeIconDisabled` from `ButtonIcons.xaml` into `Content` and `ContentDisabled`, respectively.
|
||
|
|
|
||
|
|
- **`WindowRestoreButton`**
|
||
|
|
*Button for window restore functionality (when maximized).*
|
||
|
|
- `public WindowRestoreButton()`
|
||
|
|
Constructor. Loads `WindowButtonRestoreIcon` and `WindowButtonRestoreIconDisabled` from `ButtonIcons.xaml` into `Content` and `ContentDisabled`, respectively.
|
||
|
|
|
||
|
|
- **`WindowCloseButton`**
|
||
|
|
*Button for window close functionality.*
|
||
|
|
- `public WindowCloseButton()`
|
||
|
|
Constructor. Loads `WindowButtonCloseIcon` and `WindowButtonCloseIconDisabled` from `ButtonIcons.xaml` into `Content` and `ContentDisabled`, respectively.
|
||
|
|
|
||
|
|
### Structs/Enums:
|
||
|
|
|
||
|
|
- **`WindowButtonState`**
|
||
|
|
`public enum WindowButtonState { Normal, Disabled, None }`
|
||
|
|
Defines possible states for window buttons. *Note: This enum is declared but not used in the provided source files.*
|
||
|
|
|
||
|
|
### Type Converters:
|
||
|
|
|
||
|
|
- **`TypeConverterStringToUIElement`**
|
||
|
|
*Converts string values to `TextBlock` for XAML property assignment.*
|
||
|
|
- `public override bool CanConvertFrom(...)`
|
||
|
|
Returns `true` only if `sourceType == typeof(string)`.
|
||
|
|
- `public override object ConvertFrom(...)`
|
||
|
|
Converts a string to a `TextBlock` with `Text = value`, `VerticalAlignment = Center`, and `Margin = new Thickness(3, 0, 0, 0)`. Used to enable `Caption="string"` syntax in XAML.
|
||
|
|
|
||
|
|
## 3. Invariants
|
||
|
|
|
||
|
|
- **Content Consistency**: `ActiveContent` always equals `Content` when `IsEnabled == true`, and `ContentDisabled` when `IsEnabled == false`. This is enforced by `RefreshContent()` called on `IsEnabledChanged` and property setters.
|
||
|
|
- **Resource Loading**: All button constructors *must* successfully load `ButtonIcons.xaml` from the `pack://application:,,,/CustomWindow;component/ButtonIcons.xaml` URI. Failure (e.g., missing resource) will cause a runtime exception.
|
||
|
|
- **Dependency Property Overrides**: `Content` and `ContentDisabled` are *new* (not `override`) properties that wrap the base `Button.Content` dependency property. This hides the base property and enforces custom behavior.
|
||
|
|
- **State-Driven Content**: `ActiveContent` is the *only* property directly bound to the visual content; `Content`/`ContentDisabled` are *sources* for `ActiveContent`.
|
||
|
|
|
||
|
|
## 4. Dependencies
|
||
|
|
|
||
|
|
### Internal Dependencies:
|
||
|
|
- **`ButtonIcons.xaml`**: Required XAML resource file containing `ResourceDictionary` entries for icons (e.g., `"WindowButtonMinimizeIcon"`, `"WindowButtonCloseIconDisabled"`).
|
||
|
|
- **`WindowButton.xaml`**: XAML file defining the base `WindowButton` template (referenced via `InitializeComponent()` in the constructor).
|
||
|
|
- **`CustomWindow` namespace**: All classes belong to this namespace; cross-references (e.g., `WindowButton`) are internal.
|
||
|
|
|
||
|
|
### External Dependencies:
|
||
|
|
- **WPF Framework**:
|
||
|
|
- `System.Windows` (`Application`, `Window`, `Button`, `ResourceDictionary`, `XamlReader`, `CornerRadius`, `Brush`)
|
||
|
|
- `System.Windows.Controls` (`Button`, `TextBlock`, `VerticalAlignment`)
|
||
|
|
- `System.Windows.Markup` (`XamlReader`)
|
||
|
|
- `System.IO` (`Stream`)
|
||
|
|
- **.NET Core/.NET Framework**: Base libraries (`System`, `System.ComponentModel`, `System.Globalization`).
|
||
|
|
|
||
|
|
### Inferred Usage:
|
||
|
|
- `WindowButton` subclasses (`WindowMinimizeButton`, `WindowMaximizeButton`, `WindowRestoreButton`, `WindowCloseButton`) are likely used in a custom window template (e.g., `CustomWindow` class, not provided here).
|
||
|
|
- `TypeConverterStringToUIElement` is likely applied to a `Caption` property in a custom window control (e.g., via `[TypeConverter(typeof(TypeConverterStringToUIElement))]`).
|
||
|
|
|
||
|
|
## 5. Gotchas
|
||
|
|
|
||
|
|
- **Hardcoded Resource URI**: The `pack://application:,,,/CustomWindow;component/ButtonIcons.xaml` URI is hardcoded in all button constructors. If the resource is moved, renamed, or the assembly name changes, all buttons will fail at runtime.
|
||
|
|
- **No Fallback for Missing Resources**: If `ButtonIcons.xaml` or its expected keys (e.g., `"WindowButtonMaximizeIcon"`) are missing, `XamlReader.Load()` or dictionary access will throw an exception.
|
||
|
|
- **`ActiveContent` is Not a Dependency Property**: While `ActiveContent` is a dependency property, it is *not* used for styling or data binding in the provided code. Its purpose is internal state management.
|
||
|
|
- **`CornerRadius` Not Applied in Subclasses**: Subclasses (e.g., `WindowMinimizeButton`) have commented-out `CornerRadius` assignments. The current implementation relies on the base `CornerRadius` property, but no default is set in constructors.
|
||
|
|
- **`BackgroundDefaultValue` is Virtual**: Subclasses *could* override `BackgroundDefaultValue`, but none do in the provided source.
|
||
|
|
- **`TypeConverterStringToUIElement` is Unused in Source**: The converter is declared but not referenced in any property or class in the provided files. Its usage is inferred from comments but not verified.
|
||
|
|
- **No Error Handling**: Resource loading and XAML parsing lack try/catch blocks. Failures will crash the constructor.
|