--- 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()` 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.