This module provides a collection of WPF UI controls and supporting utilities for the DTS (Device Test System) application. It includes specialized input controls (e.g., IPTextBox, TestIDTextBox), layout helpers (DynamicGrid, GridLengthAnimation), and test ID management components (TestIdPreFixSuffixHelper, TestIDViewModel, TestIdControl). These controls extend standard WPF functionality to support domain-specific requirements such as structured test ID generation, IP address entry validation, dynamic grid layout, and column header interactions (selectable/searchable headers with popups). The module serves as a foundational UI component library for test setup and execution interfaces.
2. Public Interface
Classes
RoundedBox
public void Connect(int connectionId, object target)
Placeholder method intended for connection logic; currently throws NotImplementedException.
TestIDView
No public methods or properties exposed beyond default UserControl behavior.
checkbox
public void ToolTipEventHandler(object sender, ToolTipEventArgs e)
Handles tooltip requests by publishing a HelpTextEvent via Prism's IEventAggregator, including the sender and event args in the HelpTextEventArg.
GridLengthAnimation
public GridLength From { get; set; }
Starting GridLength value for the animation.
public GridLength To { get; set; }
Ending GridLength value for the animation.
public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock)
Computes interpolated GridLength value based on animation progress, preserving GridUnitType (Star/Pixel) from the To value.
ISOPopup
private void ISOPart_OnPreviewKeyUp(object sender, KeyEventArgs e)
Filters keyboard input in child controls to allow only alphanumeric keys, numeric pad digits, control keys (Enter, Tab, Backspace, etc.), and the OemQuestion key.
private void ISOPart_OnGotMouseCapture(object sender, MouseEventArgs e)
Selects all text in a TextBox when it receives mouse capture.
private void ISOPart_OnGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
Selects all text in a TextBox when it receives keyboard focus.
LookupPopup
public event ChannelCodeSelectedEventHandler ChannelCodeSelected
Event raised when a channel code is selected (via double-click on a DataGrid item).
public IList PossibleChannels { get; set; }
Dependency property backing the list of available channel codes.
public delegate void ChannelCodeSelectedEventHandler(object sender, string code, string name)
Delegate for the ChannelCodeSelected event.
private void PossibleChannels_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
Extracts Code and Name properties from the selected item and raises ChannelCodeSelected.
TestIdPreFixSuffixHelper
public TestIdPreFixSuffix TestIdPreFixSuffix { get; }
Encapsulated prefix/suffix configuration.
public override string ToString()
Returns localized string via Strings.Strings.ResourceManager, or the raw value if not found.
AutoSizedGridView
protected override void PrepareItem(ListViewItem item)
Ensures columns with Width="Auto" (unbound) are correctly measured and re-measured when items are prepared. Handles re-binding of width-bound columns if binding is lost.
TestIDTextBox
public string Text { get; set; }
Dependency property for the full test ID text value.
public void Clear()
Clears the internal tbTestId text box.
private static bool IsValidText(string text)
Validates text against invalid filename/path characters and the period (.) character.
DynamicGrid
public byte GridColumns { get; set; }
Number of columns in the grid; changing this triggers a layout refresh.
public void Refresh()
Recalculates column and row definitions and assigns children to grid cells in row-major order. Adds a final star-width column and row for expansion.
TestIDViewModel
public string TestSetupLabel { get; set; }
Label for test setup; affects TestSetupLabelVisibility.
public Visibility TestSetupLabelVisibility { get; } Visibility.Visible if TestSetupLabel is non-empty, else Collapsed.
public string TestIdEditableText { get; set; }
User-editable portion of the test ID.
public void PopulateAllTestIdPrefixSuffixValues(string[] serializedValues)
Initializes list of available prefix/suffix options from DB values.
public TestIdPreFixSuffixHelper[] AllTestIdPrefixSuffixValues { get; }
Read-only array of available prefix/suffix helpers.
public TestIdPreFixSuffixHelper SelectedTestIdPrefixValueItem { get; set; }
Currently selected prefix helper (default: None).
public TestIdPreFixSuffixHelper SelectedTestIdSuffixValueItem { get; set; }
Currently selected suffix helper (default: TimeStamp).
public string TestName { get; set; }
Test name used when prefix/suffix is TestSetupName.
public string GetTestId()
Constructs test ID by concatenating prefix, test setup label, editable text, and suffix with underscores.
private string GetRunTimeTestIdPrefixOrSuffix(TestIdPreFixSuffixHelper prefixOrSuffix)
Resolves runtime value for a prefix/suffix helper (e.g., timestamp or test name).
public string GetTestIdTimestamp()
Returns current timestamp as yyyy_MM_dd HH_mm.
TestIdControl
public string TestSetupLabel { get; set; }
Same as in TestIDViewModel.
public Visibility TestSetupLabelVisibility { get; }
Same as in TestIDViewModel.
public string TestIdEditableText { get; set; }
Same as in TestIDViewModel.
public void PopulateAllTestIdPrefixSuffixValues(string[] serializedValues)
Same as in TestIDViewModel.
public TestIdPreFixSuffixHelper[] AllTestIdPrefixSuffixValues { get; }
Same as in TestIDViewModel.
public TestIdPreFixSuffixHelper SelectedTestIdPrefixValueItem { get; set; }
Same as in TestIDViewModel.
public TestIdPreFixSuffixHelper SelectedTestIdSuffixValueItem { get; set; }
Same as in TestIDViewModel.
public string TestName { get; set; }
Same as in TestIDViewModel.
public string GetTestId()
Same as in TestIDViewModel.
private string GetRunTimeTestIdPrefixOrSuffix(TestIdPreFixSuffixHelper prefixOrSuffix)
Same as in TestIDViewModel.
public string GetTestIdTimestamp()
Same as in TestIDViewModel.
GridViewColumnHeaderSelectable
public string ListviewId { get; set; }
Identifier for the associated ListView.
public string HeaderTitle { get; set; }
Display title for the header.
public bool ToggleButtonIsChecked { get; set; }
Controls popup state; raises OpenChanged event on change.
public event RoutedEventHandler OpenChanged
Raised when popup state changes.
public event RoutedEventHandler ClickHandler
Raised on header click.
public event RoutedEventHandler SelectAll
Raised when "Select All" or "Clear All" buttons are clicked.
IPTextBox
public string Address { get; set; }
Dependency property for full IP address string (e.g., "192.168.1.1").
public void Clear()
Clears all four internal TextBox segments.
GridViewColumnHeaderSearchable
public string ListviewId { get; set; }
Identifier for the associated ListView.
public string HeaderTitle { get; set; }
Display title for the header.
public bool ToggleButtonIsChecked { get; set; }
Controls popup state; raises OpenChanged event on change.
public string HeaderSearchTerm { get; set; }
Current search term; raises Search event on change.
public Geometry ToggleIconGeometry { get; }
Returns arrow or filter icon geometry based on search term presence.
public event RoutedEventHandler OpenChanged
Raised when popup state changes.
public event RoutedEventHandler Search
Raised when search term changes.
Enums
TestIdFixedPrefixSuffixValues
NotFixed = -1
None = 0
TimeStamp = 1
TestSetupName = 2
3. Invariants
GridLengthAnimation.GetCurrentValue:
The GridUnitType of the result is determined solely by the To.IsStar property; From's unit type is ignored.
IPTextBox input validation:
Only digits (0–9, including Numpad), period (./OemPeriod/Decimal), navigation keys (Left/Right), Backspace, Tab, and Delete are allowed. Clipboard operations (Ctrl+C/V/A/X) are permitted.
TestIDTextBox text validation:
Text must not contain any characters from Path.GetInvalidFileNameChars(), Path.GetInvalidPathChars(), or . (period).
DynamicGrid.Refresh():
Columns are created with Auto width for all but the last column, which is Star.
Rows are created with Auto height for all but the last row, which is Star.
Children are assigned to grid cells in row-major order.
ISOPopup key filtering:
Only alphanumeric keys (A–Z, 0–9), Numpad digits (NumPad0–NumPad9), control keys (Enter, Tab, Backspace, Delete, Home, End), and OemQuestion are allowed.
TestIdPreFixSuffixHelper.ToString():
Returns a localized string if available (via Strings.Strings.ResourceManager), otherwise returns the raw internal string.
4. Dependencies
Dependencies on this module:
DTS.Common.Events: Used by checkbox (for HelpTextEvent), GridViewColumnHeaderSelectable, and GridViewColumnHeaderSearchable (for ListViewStatusEvent).
Prism.Ioc / Prism.Events: Used by checkbox, GridViewColumnHeaderSelectable, and GridViewColumnHeaderSearchable (for IEventAggregator and ContainerLocator).
DTS.Common.Interface.Channels.ChannelCodes: Used by LookupPopup (for IChannelCode).
DTS.Common.Base: Used by GridViewColumnHeaderSelectable and GridViewColumnHeaderSearchable (for IBasePropertyChanged).
DTS.Common.Utilities.Logging: Used by GridViewColumnHeaderSelectable and GridViewColumnHeaderSearchable (for logging utilities).
DTS.Common: Used by TestIdPreFixSuffixHelper (for Base.BasePropertyChanged).
.NET Base Libraries: System, System.Collections.Generic, System.ComponentModel, System.IO, System.Linq, System.Threading.Tasks.
5. Gotchas
RoundedBox.Connect is unimplemented: The method throws NotImplementedException; callers must not invoke it.
BoolToInvertedBoolConverter.ConvertBack is not implemented: Throwing NotImplementedException if used in two-way bindings.
TestIdControl is deprecated: The class summary explicitly states: "Remove this control after deleting the TTS module and migrating to new test setup wizard".
TestIDTextBox and IPTextBox share similar validation logic: Both validate against invalid path/filename characters, but TestIDTextBox additionally forbids . while IPTextBox requires it.
DynamicGrid.Refresh() behavior:
The last column is always Star width, and the last row is always Star height, regardless of content.
If GridColumns is set to 0, Refresh() will create no columns, potentially breaking layout.
GridViewColumnHeaderSelectable/Searchable event subscription:
Both subscribe to ListViewStatusEvent in their constructor. If ListviewId is not set correctly, the event handler may not clear search terms on ListView unload.
TestIdPreFixSuffixHelper equality semantics: Equals() returns base.Equals() if FixedValue != NotFixed, but compares string representations only if FixedValue == NotFixed. This may lead to unexpected equality results for non-NotFixed values.
TestIDViewModel/TestIdControl timestamp format: GetTestIdTimestamp() uses space () as separator between date and time (yyyy_MM_dd HH_mm), which may cause issues in file system contexts.
LookupPopup reflection usage: PossibleChannels_OnMouseDoubleClick uses reflection (GetProperty("Code")?.GetValue(...)) to extract Code/Name from items; this assumes all items have these properties and may fail silently if they do not.