--- source_files: - DTS Viewer/DTS.Viewer/RegionAdapters/StackPanelRegionAdapter.cs generated_at: "2026-04-16T11:23:32.925488+00:00" model: "zai-org/GLM-5-FP8" schema_version: 1 sha256: "d99a52248dae627a" --- # StackPanelRegionAdapter Documentation ## 1. Purpose `StackPanelRegionAdapter` is a Prism region adapter that enables a WPF `StackPanel` control to act as a Prism region. It bridges the Prism region infrastructure with the `StackPanel`'s `Children` collection, automatically synchronizing views added to or removed from the region with the panel's visual children. This allows views to be dynamically composed within a `StackPanel` using Prism's region management system. ## 2. Public Interface ### `StackPanelRegionAdapter` (Class) **Inherits from:** `RegionAdapterBase` #### Constructor ```csharp public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) ``` Initializes a new instance of the adapter, passing the region behavior factory to the base class. #### Protected Methods ```csharp protected override void Adapt(IRegion region, StackPanel regionTarget) ``` Subscribes to the `region.Views.CollectionChanged` event and synchronizes the `StackPanel`'s `Children` collection: - On `NotifyCollectionChangedAction.Add`: Iterates `e.NewItems` and adds each `UIElement` to `regionTarget.Children`. - On `NotifyCollectionChangedAction.Remove`: Iterates `e.OldItems` and removes each `UIElement` from `regionTarget.Children` if present. - Returns immediately if `region` is `null`. ```csharp protected override IRegion CreateRegion() ``` Creates and returns a new `AllActiveRegion` instance, indicating all views in this region are considered active simultaneously. ## 3. Invariants - The `region` parameter in `Adapt()` must not be `null` for any synchronization to occur (method returns early otherwise). - All items in `region.Views` must be castable to `UIElement`; the code performs a direct cast without type checking. - The `regionTarget` must be a valid `StackPanel` instance. - The adapter creates an `AllActiveRegion`, meaning all views added to this region will be active at once (as opposed to single-active regions like tabs). ## 4. Dependencies ### This module depends on: - `System.Collections.Specialized` (`NotifyCollectionChangedAction`) - `System.Windows` (`UIElement`) - `System.Windows.Controls` (`StackPanel`) - `Microsoft.Practices.Prism.Regions` (`IRegion`, `IRegionBehaviorFactory`, `RegionAdapterBase`, `AllActiveRegion`) ### Consumers: - This adapter must be registered with the Prism region adapter mappings (not shown in source) to be used for `StackPanel` controls. ## 5. Gotchas - **Unhandled collection actions**: The `Adapt` method only handles `Add` and `Remove` actions. `Replace`, `Move`, and `Reset` actions from `NotifyCollectionChangedAction` are silently ignored, which could lead to desynchronization if the region's view collection triggers these actions. - **No event unsubscription**: The `CollectionChanged` handler is never unsubscribed. If the adapter or region outlives the `StackPanel`, this could cause memory leaks or unexpected behavior. - **Redundant variable assignment**: In the `Remove` case, `var element = elementLoopVariable;` creates an unnecessary local copy. This appears to be a legacy closure pattern but serves no purpose here since the variable is not captured. - **No type safety on collection items**: The code casts `e.NewItems` and `e.OldItems` elements directly to `UIElement` without validation. Non-`UIElement` items will throw `InvalidCastException` at runtime.