Files
DP44/enriched-qwen3-coder-next/DTS Viewer/DTS.Viewer/Modules/Main/View.md

139 lines
7.5 KiB
Markdown
Raw Normal View History

2026-04-17 14:55:32 -04:00
---
source_files:
- DTS Viewer/DTS.Viewer/Modules/Main/View/MainView.xaml.cs
- DTS Viewer/DTS.Viewer/Modules/Main/View/ViewerShellView.xaml.cs
- DTS Viewer/DTS.Viewer/Modules/Main/View/MainViewLite.xaml.cs
- DTS Viewer/DTS.Viewer/Modules/Main/View/ExportMainView.xaml.cs
- DTS Viewer/DTS.Viewer/Modules/Main/View/ViewerMainView.xaml.cs
- DTS Viewer/DTS.Viewer/Modules/Main/View/ExportMainViewGrid.xaml.cs
- DTS Viewer/DTS.Viewer/Modules/Main/View/ViewerMainViewGrid.xaml.cs
generated_at: "2026-04-16T14:05:18.299277+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "a7a3a3c725d7b68b"
---
# Documentation: DTS.Viewer Main View Module
## 1. Purpose
This module contains the main view components for the DTS Viewer application, implementing a WPF-based UI with multiple view variants (standard, lite, export, and viewer modes). The views serve as code-behind files for XAML-defined user interfaces, handling view initialization, event subscription via Prism's event aggregator, and PDF/PNG export functionality. These views implement interfaces from `DTS.Common.Interface` to enable loose coupling with view models in what appears to be a MVVM architecture.
---
## 2. Public Interface
### MainView
```csharp
public partial class MainView : IMainView
```
- **Constructor:** `MainView()` — Initializes the component via `InitializeComponent()`.
- **Role:** Primary main window view implementation.
### ViewerShellView
```csharp
public partial class ViewerShellView : IViewerShellView
```
- **Constructor:** `ViewerShellView()` — Initializes the component via `InitializeComponent()`.
- **Role:** Shell container view for the viewer mode.
### MainViewLite
```csharp
public partial class MainViewLite : IMainViewerView
```
- **Constructor:** `MainViewLite()` — Initializes the component via `InitializeComponent()`.
- **Role:** Lightweight version of the main viewer view.
### ExportMainView
```csharp
public partial class ExportMainView : IExportMainView
```
- **Constructor:** `ExportMainView()` — Initializes the component via `InitializeComponent()`.
- **Role:** Main view for export functionality.
### ViewerMainView
```csharp
public partial class ViewerMainView : IViewerMainView
```
- **Constructor:** `ViewerMainView()` — Initializes the component via `InitializeComponent()`.
- **Role:** Main view for viewer mode. Contains commented-out AvalonDock layout serialization/deserialization logic.
### ExportMainViewGrid
```csharp
public partial class ExportMainViewGrid : IExportMainViewGrid
```
- **Constructor:** `ExportMainViewGrid()` — Initializes component and subscribes to `Loaded` event.
- **Methods:**
- `public int SaveToPDF(string directory, string pdfFileName)` — Renders `MainShell` to a PDF and PNG file. Returns `> 0` on success, `< 0` on failure, `0` if `MainShell` is not ready.
- **Event Handlers:**
- `ExportMainViewGrid_Loaded` — Resolves `IEventAggregator` and subscribes to `GraphLoadedCountNotification`.
- `OnGraphLoadedCountNotification(GraphLoadedCountNotificationArg arg)` — Triggers focus setting after 3-second delay if `DataContext` matches `arg.ParentVM`.
- `SetFocus()`**Empty implementation** (no-op).
### ViewerMainViewGrid
```csharp
public partial class ViewerMainViewGrid : IViewerMainViewGrid
```
- **Constructor:** `ViewerMainViewGrid()` — Initializes component and subscribes to `Loaded` event.
- **Methods:**
- `public int SaveToPDF(string directory, string pdfFileName)` — Renders `MainShell` to a PDF and PNG file. Returns `> 0` on success, `< 0` on failure, `0` if `MainShell` is not ready.
- **Event Handlers:**
- `ViewerMainViewGrid_Loaded` — Resolves `IEventAggregator` and subscribes to `GraphLoadedCountNotification`.
- `OnGraphLoadedCountNotification(GraphLoadedCountNotificationArg arg)` — Triggers focus setting after 3-second delay if `DataContext` matches `arg.ParentVM`.
- `SetFocus()` — Sets `chartOptTab.IsSelected = true`, makes it focusable, and calls `Focus()`.
---
## 3. Invariants
1. **Interface Implementation:** All view classes implement their respective interfaces from `DTS.Common.Interface` (`IMainView`, `IViewerShellView`, `IMainViewerView`, `IExportMainView`, `IViewerMainView`, `IExportMainViewGrid`, `IViewerMainViewGrid`).
2. **SaveToPDF Preconditions:**
- `directory` must be non-null and non-empty.
- `pdfFileName` must be non-null, non-empty, and end with `.pdf`.
- `MainShell.DesiredSize.Height` and `MainShell.DesiredSize.Width` must be `> 0` for export to proceed.
3. **Event Subscription Timing:** `IEventAggregator` is resolved and event subscriptions occur in the `Loaded` event handler, not the constructor (per FB 14797).
4. **Focus Timing:** Focus is set via `Dispatcher.BeginInvoke` after a 3-second `Thread.Sleep` following `GraphLoadedCountNotification`.
5. **DataContext Matching:** `OnGraphLoadedCountNotification` only proceeds if `DataContext` is non-null and equals `arg.ParentVM` cast to `IBaseViewModel`.
---
## 4. Dependencies
### External Dependencies (Imports)
| Namespace | Purpose |
|-----------|---------|
| `DTS.Common.Interface` | View interfaces (`IMainView`, `IViewerShellView`, `IMainViewerView`, `IExportMainView`, `IViewerMainView`, `IExportMainViewGrid`, `IViewerMainViewGrid`) |
| `DTS.Common.Base` | `IBaseViewModel` interface |
| `DTS.Common.Events` | `GraphLoadedCountNotification` event, `GraphLoadedCountNotificationArg` argument class |
| `DTS.Common.Utilities.Logging` | `APILogger.LogException()` for error logging |
| `DTS.Common.Utils` | `PNGImageUtil.SaveImage()` for PNG export |
| `Prism.Events` | `IEventAggregator` for pub/sub messaging |
| `Prism.Ioc` | `ContainerLocator` for service location |
| `C1.WPF.Pdf` | `C1PdfDocument` for PDF generation (ComponentOne library) |
| `System.Windows.Media` | `VisualTreeHelper`, `PixelFormats` for visual rendering |
| `System.Windows.Media.Imaging` | `RenderTargetBitmap`, `WriteableBitmap` for bitmap rendering |
### Downstream Dependencies
- Unknown from source alone. These views are likely referenced by view models or a bootstrapper/module initializer that resolves them via dependency injection.
---
## 5. Gotchas
1. **Hardcoded 3-Second Delay:** Both `ExportMainViewGrid` and `ViewerMainViewGrid` use `Thread.Sleep(TimeSpan.FromSeconds(3))` before setting focus. This is a timing-based workaround (FB 14797) that may be unreliable on slower systems.
2. **Empty SetFocus() in ExportMainViewGrid:** `ExportMainViewGrid.SetFocus()` is empty while `ViewerMainViewGrid.SetFocus()` has actual implementation. This appears to be intentional (perhaps the `chartOptTab` element doesn't exist in the export view), but is non-obvious.
3. **Side Effect in SaveToPDF:** The `SaveToPDF` method also generates a PNG file as a side effect via `PNGImageUtil.SaveImage()`, which may not be expected from the method name alone.
4. **Service Locator Pattern:** `IEventAggregator` is resolved via `ContainerLocator.Container.Resolve<IEventAggregator>()` rather than constructor injection, making the dependency implicit.
5. **Commented-Out AvalonDock Code:** `ViewerMainView` contains significant commented-out code for AvalonDock layout serialization (`XmlLayoutSerializer`, `DockManager`). This suggests either deprecated functionality or a feature that was intentionally disabled.
6. **Return Value Ambiguity in SaveToPDF:** The method returns `1` for success but the documentation states `> 0`. Callers should check `> 0` rather than `== 1` for forward compatibility.
7. **ReSharper Disable Directives:** Multiple files contain `// ReSharper disable` comments, indicating suppressed static analysis warnings. This may mask potential issues.