diff --git a/CITATION.cff b/CITATION.cff
index 6ffa2109..12829758 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -2,8 +2,8 @@ cff-version: 1.2.0
message: "If you use this software, please cite it as below."
type: software
title: "WPF Framework"
-version: "1.0.3"
-date-released: "2026-07-14"
+version: "1.0.4"
+date-released: "2026-07-17"
license: 0BSD
repository-code: "https://github.com/USACE-RMC/WPF-Framework"
url: "https://github.com/USACE-RMC/WPF-Framework"
diff --git a/Directory.Build.props b/Directory.Build.props
index 77c75074..cb8e22a9 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -14,9 +14,9 @@
https://github.com/USACE-RMC/WPF-Framework
https://github.com/USACE-RMC/WPF-Framework
git
- 1.0.3
- 1.0.3.0
- 1.0.3.0
+ 1.0.4
+ 1.0.4.0
+ 1.0.4.0
false
false
diff --git a/Directory.Packages.props b/Directory.Packages.props
index d5d2d565..cc7d0081 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -15,10 +15,10 @@
4.2.1
3.14.0
4.5.0
-
- 2.*
+
+ 2.1.4
- [2.1.1,3.0.0)
+ [2.1.4,3.0.0)
3.50.4.5
2.0.2
2.9.2
diff --git a/README.md b/README.md
index d24ec387..a2a41f02 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ WPF Framework is a free and open-source .NET 10.0 application framework for buil
WPF Framework can be consumed from source project references or packaged into NuGet bundles with `scripts/pack-wpf-framework.ps1`. The package layout follows the internal dependency map: Core, Models, Support, then Controls.
-The framework depends on [RMC.Numerics](https://github.com/USACE-RMC/Numerics) through central NuGet package management in `Directory.Packages.props`. Source builds restore the latest compatible 2.x package; NuGet bundles declare compatibility with RMC.Numerics 2.1.1 or later, below 3.0.0.
+The framework depends on [RMC.Numerics](https://github.com/USACE-RMC/Numerics) through central NuGet package management in `Directory.Packages.props`. Source builds restore RMC.Numerics 2.1.4; NuGet bundles declare compatibility with RMC.Numerics 2.1.4 or later, below 3.0.0.
## Solution Structure
@@ -51,7 +51,7 @@ dotnet test WPF-Framework.sln
### Build Packages
```bash
-.\scripts\pack-wpf-framework.ps1 -Configuration Release -Version 1.0.3
+.\scripts\pack-wpf-framework.ps1 -Configuration Release -Version 1.0.4
```
This creates and validates the following NuGet packages in `artifacts/packages/`:
@@ -61,7 +61,7 @@ This creates and validates the following NuGet packages in `artifacts/packages/`
| [`RMC.Wpf.Framework.Core`](https://www.nuget.org/packages/RMC.Wpf.Framework.Core/) | FrameworkInterfaces, Themes | None |
| [`RMC.Wpf.Framework.Models`](https://www.nuget.org/packages/RMC.Wpf.Framework.Models/) | DAG, DatabaseManager, ExpressionParser, OxyPlot libraries | ClosedXML, DocumentFormat.OpenXml, ExcelNumberFormat, FastMember, SourceGear.sqlite3, System.Data.SQLite |
| [`RMC.Wpf.Framework.Support`](https://www.nuget.org/packages/RMC.Wpf.Framework.Support/) | SoftwareUpdate and updater content files | None |
-| [`RMC.Wpf.Framework.Controls`](https://www.nuget.org/packages/RMC.Wpf.Framework.Controls/) | FrameworkUI, control libraries, AvalonDock fork | Core, Models, Support, RMC.Numerics 2.x |
+| [`RMC.Wpf.Framework.Controls`](https://www.nuget.org/packages/RMC.Wpf.Framework.Controls/) | FrameworkUI, control libraries, AvalonDock fork | Core, Models, Support, RMC.Numerics 2.1.4+ |
### Minimal Application
diff --git a/codemeta.json b/codemeta.json
index 36c0cede..66128ddb 100644
--- a/codemeta.json
+++ b/codemeta.json
@@ -3,9 +3,9 @@
"@type": "SoftwareSourceCode",
"name": "WPF Framework",
"description": "A free and open-source .NET 10 application framework for building Windows desktop project management applications. Provides a docking application shell with theming, project explorer, undo/redo, and specialized controls for charting, numeric input, databases, expression parsing, and directed acyclic graphs.",
- "version": "1.0.3",
+ "version": "1.0.4",
"dateCreated": "2025-12-29",
- "dateModified": "2026-07-14",
+ "dateModified": "2026-07-17",
"license": "https://spdx.org/licenses/0BSD",
"codeRepository": "https://github.com/USACE-RMC/WPF-Framework",
"issueTracker": "https://github.com/USACE-RMC/WPF-Framework/issues",
diff --git a/docs/architecture.md b/docs/architecture.md
index cf40bf28..1171a113 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -83,9 +83,9 @@ The packaging projects in `src/Packaging/` create four bundles. Packages should
| `RMC.Wpf.Framework.Core` | FrameworkInterfaces, Themes | None |
| `RMC.Wpf.Framework.Models` | DAG, DatabaseManager, ExpressionParser, OxyPlot, OxyPlot.Wpf, OxyPlot.Wpf.Shared | ClosedXML, DocumentFormat.OpenXml, ExcelNumberFormat, FastMember, SourceGear.sqlite3, System.Data.SQLite |
| `RMC.Wpf.Framework.Support` | SoftwareUpdate plus SoftwareUpdate.Updater content files | None |
-| `RMC.Wpf.Framework.Controls` | FrameworkUI, GenericControls, NumericControls, OxyPlotControls, DatabaseControls, ExpressionParserControls, DAGControls, Xceed.Wpf.AvalonDock, Xceed.Wpf.AvalonDock.Themes.VS2013 | `RMC.Wpf.Framework.Core`, `RMC.Wpf.Framework.Models`, `RMC.Wpf.Framework.Support`, `RMC.Numerics` 2.x |
+| `RMC.Wpf.Framework.Controls` | FrameworkUI, GenericControls, NumericControls, OxyPlotControls, DatabaseControls, ExpressionParserControls, DAGControls, Xceed.Wpf.AvalonDock, Xceed.Wpf.AvalonDock.Themes.VS2013 | `RMC.Wpf.Framework.Core`, `RMC.Wpf.Framework.Models`, `RMC.Wpf.Framework.Support`, `RMC.Numerics` 2.1.4+ |
-AvalonDock is a vendored UI dependency and is packaged with `RMC.Wpf.Framework.Controls`, not Core. `RMC.Numerics` is consumed as a NuGet package through central package management and should not be referenced through local `HintPath` DLLs. Source builds use the floating `2.*` version, while packages declare a compatible `[2.1.1,3.0.0)` dependency range.
+AvalonDock is a vendored UI dependency and is packaged with `RMC.Wpf.Framework.Controls`, not Core. `RMC.Numerics` is consumed as a NuGet package through central package management and should not be referenced through local `HintPath` DLLs. Source builds restore `RMC.Numerics` 2.1.4, while packages declare a compatible `[2.1.4,3.0.0)` dependency range.
## 3. Core Framework
@@ -217,7 +217,7 @@ Key additions beyond upstream:
| Dependency | Source | Purpose |
|-----------|--------|---------|
-| **RMC.Numerics** | [USACE-RMC/Numerics](https://github.com/USACE-RMC/Numerics) NuGet package, latest compatible 2.x | Statistical distributions, parameter estimation, bootstrap analysis. Required by NumericControls and DatabaseControls. |
+| **RMC.Numerics** | [USACE-RMC/Numerics](https://github.com/USACE-RMC/Numerics) NuGet package, 2.1.4 or later compatible 2.x | Statistical distributions, parameter estimation, bootstrap analysis. Required by NumericControls and DatabaseControls. |
All other dependencies are either vendored into the solution (AvalonDock, OxyPlot) or available as NuGet packages (System.Data.SQLite, DocumentFormat.OpenXml, etc.).
diff --git a/docs/getting-started.md b/docs/getting-started.md
index 9896704c..d778470b 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -30,7 +30,7 @@ For NuGet consumption, reference the Controls bundle. It brings in Core, Models,
```xml
-
+
```
diff --git a/scripts/pack-wpf-framework.ps1 b/scripts/pack-wpf-framework.ps1
index 08078b0c..b86b1f3e 100644
--- a/scripts/pack-wpf-framework.ps1
+++ b/scripts/pack-wpf-framework.ps1
@@ -99,10 +99,16 @@ $expectedVersionedEntries = @{
}
$expectedReleaseNotes = @{
- "RMC.Wpf.Framework.Core" = "Coordinated WPF Framework 1.0.3 release; no package-specific functional changes."
- "RMC.Wpf.Framework.Models" = "Coordinated WPF Framework 1.0.3 release; no package-specific functional changes."
- "RMC.Wpf.Framework.Support" = "Coordinated WPF Framework 1.0.3 release; no package-specific functional changes."
- "RMC.Wpf.Framework.Controls" = "Version 1.0.3 defaults the DatabaseControls TableViewer Export Table dialog to CSV while retaining DBF, Excel, and SQLite options."
+ "RMC.Wpf.Framework.Core" = "Coordinated WPF Framework 1.0.4 release; no package-specific functional changes."
+ "RMC.Wpf.Framework.Models" = "Coordinated WPF Framework 1.0.4 release; no package-specific functional changes."
+ "RMC.Wpf.Framework.Support" = "Coordinated WPF Framework 1.0.4 release; no package-specific functional changes."
+ "RMC.Wpf.Framework.Controls" = "Version 1.0.4 updates RMC.Numerics to 2.1.4 and improves NumericControls validation and distribution selector compatibility."
+}
+
+$expectedPackageDependencies = @{
+ "RMC.Wpf.Framework.Controls" = @{
+ "RMC.Numerics" = "[2.1.4,3.0.0)"
+ }
}
foreach ($packageId in $expectedEntries.Keys) {
@@ -156,6 +162,23 @@ foreach ($packageId in $expectedEntries.Keys) {
throw "$($package.Name) has unexpected NuGet release notes."
}
+ if ($expectedPackageDependencies.ContainsKey($packageId)) {
+ foreach ($dependencyId in $expectedPackageDependencies[$packageId].Keys) {
+ $dependency = $nuspec.SelectSingleNode("/n:package/n:metadata/n:dependencies/n:group/n:dependency[@id='$dependencyId']", $namespaceManager)
+ if ($dependency -eq $null) {
+ throw "$($package.Name) is missing NuGet dependency $dependencyId."
+ }
+
+ $dependencyVersion = $dependency.Attributes["version"].Value
+ $expectedDependencyVersion = $expectedPackageDependencies[$packageId][$dependencyId]
+ $normalizedDependencyVersion = $dependencyVersion.Replace(" ", "")
+ $normalizedExpectedDependencyVersion = $expectedDependencyVersion.Replace(" ", "")
+ if ($normalizedDependencyVersion -ne $normalizedExpectedDependencyVersion) {
+ throw "$($package.Name) declares $dependencyId dependency $dependencyVersion instead of $expectedDependencyVersion."
+ }
+ }
+ }
+
$numericVersion = ($packageVersion -split '-')[0]
$expectedBinaryVersion = "$numericVersion.0"
$inspectionDirectory = Join-Path ([System.IO.Path]::GetTempPath()) "wpf-framework-package-$([Guid]::NewGuid().ToString('N'))"
diff --git a/src/DAGControls/Properties/AssemblyInfo.cs b/src/DAGControls/Properties/AssemblyInfo.cs
index cb9a9684..395978ca 100644
--- a/src/DAGControls/Properties/AssemblyInfo.cs
+++ b/src/DAGControls/Properties/AssemblyInfo.cs
@@ -1,4 +1,4 @@
-using System.Reflection;
+using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@@ -50,5 +50,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.3.0")]
-[assembly: AssemblyFileVersion("1.0.3.0")]
+[assembly: AssemblyVersion("1.0.4.0")]
+[assembly: AssemblyFileVersion("1.0.4.0")]
diff --git a/src/NumericControls/Data/Uncertain Curve Editor/DistributionDataItem.cs b/src/NumericControls/Data/Uncertain Curve Editor/DistributionDataItem.cs
index fad0edf2..a0765bc9 100644
--- a/src/NumericControls/Data/Uncertain Curve Editor/DistributionDataItem.cs
+++ b/src/NumericControls/Data/Uncertain Curve Editor/DistributionDataItem.cs
@@ -240,7 +240,13 @@ public DistributionDataItem(UncertainOrderedPairedData d, UnivariateDistribution
_isStrictY = strictY;
_xOrder = orderX;
_yOrder = orderY;
- DistributionName = UnivariateDistributionFactory.CreateDistribution(Distribution).DisplayName;
+ if (_data is not null && _data.Count > 0)
+ DistributionName = _data[0].Y.DisplayName;
+ else if (UnivariateDistributionFactory.TryCreateDistribution(Distribution, out var distribution) &&
+ distribution is not null)
+ DistributionName = distribution.DisplayName;
+ else
+ DistributionName = Distribution.ToString();
Refresh();
}
diff --git a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataSelectorControl.xaml.cs b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataSelectorControl.xaml.cs
index 8aa6053e..ab9130cf 100644
--- a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataSelectorControl.xaml.cs
+++ b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataSelectorControl.xaml.cs
@@ -434,7 +434,6 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr
{
UncertainOrderedDataSelectorControl thisControl = (UncertainOrderedDataSelectorControl)d;
thisControl.Distributions.Clear();
- UnivariateDistributionBase distribution;
if ((e.NewValue == null) || (e.NewValue.GetType() != typeof(List)))
{
thisControl.DistributionOptions = DefaultDistributionOptions;
@@ -443,8 +442,8 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr
{
foreach (var dist in (List)e.NewValue)
{
- distribution = UnivariateDistributionFactory.CreateDistribution(dist);
- if (distribution == null) continue;
+ if (!UnivariateDistributionFactory.TryCreateDistribution(dist, out var distribution) ||
+ distribution is null) continue;
//
var ordinates = new List();
for (int i = 0; i <= 5; i++)
@@ -459,9 +458,9 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr
}
///
- /// Currently does not support bivariate, univariate, or kernel density.
+ /// Returns the default distribution types supported by the uncertain curve selector.
///
- ///
+ /// A list of supported distribution types.
public static List DefaultDistributionOptions
{
get
@@ -480,6 +479,7 @@ public static List DefaultDistributionOptions
(o != UnivariateDistributionType.KernelDensity) &&
(o != UnivariateDistributionType.Mixture) &&
(o != UnivariateDistributionType.NoncentralT) &&
+ (o != UnivariateDistributionType.UserDefined) &&
(o != UnivariateDistributionType.UniformDiscrete) &&
(o != UnivariateDistributionType.Poisson)).ToList();
}
@@ -698,8 +698,13 @@ private void ValidationGrid_PreviewAddRows(int startRowIndex, int nRows, ref boo
//
DistributionDataItem selectedItem = (DistributionDataItem)CurveUncertaintyComboBox.SelectedItem;
var type = selectedItem.Data.Distribution;
+ UnivariateDistributionBase distribution;
+ if (selectedItem.Data.Count > 0)
+ distribution = selectedItem.Data[0].Y.Clone();
+ else if (!UnivariateDistributionFactory.TryCreateDistribution(type, out distribution) || distribution is null)
+ return;
for (int i = startRowIndex; i < startRowIndex + nRows; i++)
- selectedItem.Data.Insert(i, new UncertainOrdinate(0d, UnivariateDistributionFactory.CreateDistribution(type)));
+ selectedItem.Data.Insert(i, new UncertainOrdinate(0d, distribution.Clone()));
// Refresh the view
selectedItem.Refresh(); // MinimumX, MaximumX, MinimumY, MaximumY, IsStrictX, IsStrictY, OrderX, OrderY)
ValidationGrid.Items.Refresh();
diff --git a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataTableEditor.xaml.cs b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataTableEditor.xaml.cs
index 935ffede..41dce879 100644
--- a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataTableEditor.xaml.cs
+++ b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedDataTableEditor.xaml.cs
@@ -375,7 +375,6 @@ public IList DistributionOptions
private static void DistributionOptionsCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
UncertainOrderedDataTableEditor thisControl = (UncertainOrderedDataTableEditor)d;
- UnivariateDistributionBase distribution;
IList distOptions = e.NewValue as IList;
if (e.NewValue == null || distOptions == null)
{
@@ -397,11 +396,11 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr
foreach (var dist in distOptions)
{
if (thisControl._distributions.Any(o => o.Distribution == dist)) continue;
- distribution = UnivariateDistributionFactory.CreateDistribution(dist);
- if (distribution == null) continue;
+ if (!UnivariateDistributionFactory.TryCreateDistribution(dist, out var distribution) ||
+ distribution is null) continue;
var ordinates = new List();
for (int i = 0; i <= 1; i++)
- ordinates.Add(new UncertainOrdinate(i, UnivariateDistributionFactory.CreateDistribution(dist)));
+ ordinates.Add(new UncertainOrdinate(i, distribution.Clone()));
var uncertainData = new UncertainOrderedPairedData(ordinates, thisControl.IsStrictX, thisControl.OrderX, thisControl.IsStrictY, thisControl.OrderY, dist);
thisControl._distributions.Add(uncertainData);
}
@@ -409,9 +408,9 @@ private static void DistributionOptionsCallback(DependencyObject d, DependencyPr
}
///
- /// Currently does not support bivariate, empirical, or kernel density.
+ /// Returns the default distribution types supported by the uncertain curve table editor.
///
- ///
+ /// A list of supported distribution types.
public static List DefaultDistributionOptions
{
get
@@ -430,6 +429,7 @@ public static List DefaultDistributionOptions
(o != UnivariateDistributionType.KernelDensity) &&
(o != UnivariateDistributionType.Mixture) &&
(o != UnivariateDistributionType.NoncentralT) &&
+ (o != UnivariateDistributionType.UserDefined) &&
(o != UnivariateDistributionType.UniformDiscrete) &&
(o != UnivariateDistributionType.Poisson)).ToList();
}
@@ -504,7 +504,9 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
UncertainOrderedPairedData val = value as UncertainOrderedPairedData;
if (val == null) return "";
if (val.Count > 0) return val[0].Y.DisplayName;
- return UnivariateDistributionFactory.CreateDistribution(val.Distribution).DisplayName;
+ if (UnivariateDistributionFactory.TryCreateDistribution(val.Distribution, out var distribution) &&
+ distribution is not null) return distribution.DisplayName;
+ return val.Distribution.ToString();
}
///
diff --git a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedTableEditor.xaml.cs b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedTableEditor.xaml.cs
index 127f6329..bfb2d991 100644
--- a/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedTableEditor.xaml.cs
+++ b/src/NumericControls/Data/Uncertain Curve Editor/UncertainOrderedTableEditor.xaml.cs
@@ -539,8 +539,13 @@ private void ValidationGrid_PreviewAddRows(int startRowIndex, int nRows, ref boo
//
var type = UncertainOrderedData.Distribution;
var itemsToInsert = new List();
+ UnivariateDistributionBase distribution;
+ if (UncertainOrderedData.Count > 0)
+ distribution = UncertainOrderedData[0].Y.Clone();
+ else if (!UnivariateDistributionFactory.TryCreateDistribution(type, out distribution) || distribution is null)
+ return;
for (int i = startRowIndex; i < startRowIndex + nRows; i++)
- itemsToInsert.Add(new UncertainOrdinate(0d, UnivariateDistributionFactory.CreateDistribution(type)));
+ itemsToInsert.Add(new UncertainOrdinate(0d, distribution.Clone()));
// Let it update the UI since this is a preview event that is being canceled.
if (UncertainOrderedData.SuppressCollectionChanged == true)
{
diff --git a/src/NumericControls/Distributions/Univariate/Distribution Selector/DistributionSelectorControl.xaml.cs b/src/NumericControls/Distributions/Univariate/Distribution Selector/DistributionSelectorControl.xaml.cs
index c7073527..d169a0a7 100644
--- a/src/NumericControls/Distributions/Univariate/Distribution Selector/DistributionSelectorControl.xaml.cs
+++ b/src/NumericControls/Distributions/Univariate/Distribution Selector/DistributionSelectorControl.xaml.cs
@@ -461,7 +461,8 @@ public double[] SampleData
}
///
- /// Excludes Empirical, KernelDensity, and UserDefined distribution types.
+ /// Returns directly constructible distributions supported by the selector, excluding empirical,
+ /// kernel-density, user-defined, and component-only distribution types.
///
///
public static List DefaultDistributions
@@ -474,9 +475,9 @@ public static List DefaultDistributions
if (distributionType == UnivariateDistributionType.Empirical) { continue; }
if (distributionType == UnivariateDistributionType.KernelDensity) { continue; }
if (distributionType == UnivariateDistributionType.UserDefined) { continue; }
- //
- UnivariateDistributionBase distributionToAdd = UnivariateDistributionFactory.CreateDistribution(distributionType);
- if (distributionToAdd is not null) { distributions.Add(distributionToAdd); }
+ if (UnivariateDistributionFactory.TryCreateDistribution(distributionType, out var distributionToAdd) &&
+ distributionToAdd is not null)
+ distributions.Add(distributionToAdd);
}
//
return distributions;
diff --git a/src/NumericControls/Distributions/Univariate/Distribution Selector/Selector.xaml.cs b/src/NumericControls/Distributions/Univariate/Distribution Selector/Selector.xaml.cs
index 7f88f4f5..18b6d375 100644
--- a/src/NumericControls/Distributions/Univariate/Distribution Selector/Selector.xaml.cs
+++ b/src/NumericControls/Distributions/Univariate/Distribution Selector/Selector.xaml.cs
@@ -393,7 +393,8 @@ public double[] SampleData
}
///
- /// Excludes Empirical, KernelDensity, and UserDefined distribution types.
+ /// Returns directly constructible distributions supported by the selector, excluding empirical,
+ /// kernel-density, user-defined, and component-only distribution types.
///
///
public static List DefaultDistributions
@@ -406,9 +407,9 @@ public static List DefaultDistributions
if (distributionType == UnivariateDistributionType.Empirical) { continue; }
if (distributionType == UnivariateDistributionType.KernelDensity) { continue; }
if (distributionType == UnivariateDistributionType.UserDefined) { continue; }
- //
- UnivariateDistributionBase distributionToAdd = UnivariateDistributionFactory.CreateDistribution(distributionType);
- if (distributionToAdd is not null) { distributions.Add(distributionToAdd); }
+ if (UnivariateDistributionFactory.TryCreateDistribution(distributionType, out var distributionToAdd) &&
+ distributionToAdd is not null)
+ distributions.Add(distributionToAdd);
}
//
return distributions;
@@ -648,9 +649,10 @@ public void SetDistributionOptions(IEnumerable univa
{
_distributions.Add(_selectedDistribution);
}
- else
+ else if (UnivariateDistributionFactory.TryCreateDistribution(d, out var distribution) &&
+ distribution is not null)
{
- _distributions.Add(UnivariateDistributionFactory.CreateDistribution(d));
+ _distributions.Add(distribution);
}
}
DistributionCombobox.ItemsSource = _distributions;
diff --git a/src/OxyPlotControls/Properties/AssemblyInfo.cs b/src/OxyPlotControls/Properties/AssemblyInfo.cs
index 99132de8..39c2b885 100644
--- a/src/OxyPlotControls/Properties/AssemblyInfo.cs
+++ b/src/OxyPlotControls/Properties/AssemblyInfo.cs
@@ -28,8 +28,8 @@
// Build Number
// Revision
//
-[assembly: AssemblyVersion("1.0.3.0")]
-[assembly: AssemblyFileVersion("1.0.3.0")]
+[assembly: AssemblyVersion("1.0.4.0")]
+[assembly: AssemblyFileVersion("1.0.4.0")]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
diff --git a/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.csproj b/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.csproj
index 7f06e0dd..10a47ee8 100644
--- a/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.csproj
+++ b/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.csproj
@@ -3,7 +3,7 @@
net10.0-windows
true
false
- 1.0.3
+ 1.0.4
RMC.Wpf.Framework.Controls.nuspec
$(MSBuildProjectDirectory)
configuration=$(Configuration);version=$(Version);rmcNumericsPackageDependencyVersion=$(RmcNumericsPackageDependencyVersion)
diff --git a/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.nuspec b/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.nuspec
index b3db213f..a9bb67aa 100644
--- a/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.nuspec
+++ b/src/Packaging/RMC.Wpf.Framework.Controls/RMC.Wpf.Framework.Controls.nuspec
@@ -10,7 +10,7 @@
README.md
WPF controls, framework UI, DAG controls, database controls, numeric controls, OxyPlot controls, and AvalonDock assemblies for the RMC WPF Framework.
- Version 1.0.3 defaults the DatabaseControls TableViewer Export Table dialog to CSV while retaining DBF, Excel, and SQLite options.
+ Version 1.0.4 updates RMC.Numerics to 2.1.4 and improves NumericControls validation and distribution selector compatibility.
RMC WPF framework controls AvalonDock OxyPlot numeric database DAG
diff --git a/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.csproj b/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.csproj
index 9b19b29a..0b1c3f8b 100644
--- a/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.csproj
+++ b/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.csproj
@@ -3,7 +3,7 @@
net10.0-windows
true
false
- 1.0.3
+ 1.0.4
RMC.Wpf.Framework.Core.nuspec
$(MSBuildProjectDirectory)
configuration=$(Configuration);version=$(Version)
diff --git a/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.nuspec b/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.nuspec
index 49da43b9..e3879e63 100644
--- a/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.nuspec
+++ b/src/Packaging/RMC.Wpf.Framework.Core/RMC.Wpf.Framework.Core.nuspec
@@ -10,7 +10,7 @@
README.md
Core interfaces, project model contracts, undo/redo infrastructure, messaging, and WPF themes for the RMC WPF Framework.
- Coordinated WPF Framework 1.0.3 release; no package-specific functional changes.
+ Coordinated WPF Framework 1.0.4 release; no package-specific functional changes.
RMC WPF framework themes undo-redo
diff --git a/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.csproj b/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.csproj
index 24742ea2..54709311 100644
--- a/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.csproj
+++ b/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.csproj
@@ -3,7 +3,7 @@
net10.0-windows
true
false
- 1.0.3
+ 1.0.4
RMC.Wpf.Framework.Models.nuspec
$(MSBuildProjectDirectory)
configuration=$(Configuration);version=$(Version);closedXmlVersion=$(ClosedXmlVersion);documentFormatOpenXmlVersion=$(DocumentFormatOpenXmlVersion);excelNumberFormatVersion=$(ExcelNumberFormatVersion);fastMemberVersion=$(FastMemberVersion);sourceGearSqlite3Version=$(SourceGearSqlite3Version);systemDataSQLiteVersion=$(SystemDataSQLiteVersion)
diff --git a/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.nuspec b/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.nuspec
index 69be73ba..2801dba9 100644
--- a/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.nuspec
+++ b/src/Packaging/RMC.Wpf.Framework.Models/RMC.Wpf.Framework.Models.nuspec
@@ -10,7 +10,7 @@
README.md
Model, graph, database, expression-parser, and vendored OxyPlot assemblies for the RMC WPF Framework.
- Coordinated WPF Framework 1.0.3 release; no package-specific functional changes.
+ Coordinated WPF Framework 1.0.4 release; no package-specific functional changes.
RMC WPF framework database expression-parser DAG OxyPlot
diff --git a/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.csproj b/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.csproj
index 73bb61e1..d6fdd71b 100644
--- a/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.csproj
+++ b/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.csproj
@@ -3,7 +3,7 @@
net10.0-windows
true
false
- 1.0.3
+ 1.0.4
$(NoWarn);NU5100
RMC.Wpf.Framework.Support.nuspec
diff --git a/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.nuspec b/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.nuspec
index 3dfdff43..86f13fe6 100644
--- a/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.nuspec
+++ b/src/Packaging/RMC.Wpf.Framework.Support/RMC.Wpf.Framework.Support.nuspec
@@ -10,7 +10,7 @@
README.md
Software update services and deployable updater helper for the RMC WPF Framework.
- Coordinated WPF Framework 1.0.3 release; no package-specific functional changes.
+ Coordinated WPF Framework 1.0.4 release; no package-specific functional changes.
RMC WPF framework software-update updater
diff --git a/src/SoftwareUpdate.Updater/SoftwareUpdate.Updater.csproj b/src/SoftwareUpdate.Updater/SoftwareUpdate.Updater.csproj
index e9f05f1d..18444878 100644
--- a/src/SoftwareUpdate.Updater/SoftwareUpdate.Updater.csproj
+++ b/src/SoftwareUpdate.Updater/SoftwareUpdate.Updater.csproj
@@ -8,9 +8,9 @@
enable
enable
latest
- 1.0.3
- 1.0.3.0
- 1.0.3.0
+ 1.0.4
+ 1.0.4.0
+ 1.0.4.0
diff --git a/tests/NumericControls.Tests/Distributions/DistributionFactoryCompatibilityTests.cs b/tests/NumericControls.Tests/Distributions/DistributionFactoryCompatibilityTests.cs
new file mode 100644
index 00000000..2735e4bc
--- /dev/null
+++ b/tests/NumericControls.Tests/Distributions/DistributionFactoryCompatibilityTests.cs
@@ -0,0 +1,60 @@
+using global::NumericControls;
+using global::NumericControls.Distributions.Univariate;
+using Numerics.Distributions;
+using Xunit;
+
+namespace NumericControls.Tests.Distributions;
+
+///
+/// Guards NumericControls against distribution types that require external component configuration.
+///
+public class DistributionFactoryCompatibilityTests
+{
+ ///
+ /// Verifies that both selector defaults initialize without throwing and contain exact constructible types.
+ ///
+ [StaFact]
+ public void DefaultSelectorDistributions_AreDirectlyConstructible()
+ {
+ var expectedTypes = Enum.GetValues()
+ .Where(type => type != UnivariateDistributionType.Empirical &&
+ type != UnivariateDistributionType.KernelDensity &&
+ type != UnivariateDistributionType.UserDefined)
+ .Where(type => UnivariateDistributionFactory.TryCreateDistribution(type, out _))
+ .ToArray();
+
+ var selectorTypes = Selector.DefaultDistributions.Select(distribution => distribution.Type).ToArray();
+ var controlTypes = DistributionSelectorControl.DefaultDistributions
+ .Select(distribution => distribution.Type)
+ .ToArray();
+
+ Assert.Equal(expectedTypes, selectorTypes);
+ Assert.Equal(expectedTypes, controlTypes);
+ }
+
+ ///
+ /// Verifies that unsupported types are absent from uncertain-curve defaults.
+ ///
+ [StaFact]
+ public void DefaultUncertainDistributionOptions_ExcludeUnsupportedTypes()
+ {
+ var selectorOptions = UncertainOrderedDataSelectorControl.DefaultDistributionOptions;
+ var editorOptions = UncertainOrderedDataTableEditor.DefaultDistributionOptions;
+
+ Assert.All(selectorOptions, AssertDirectlyConstructible);
+ Assert.All(editorOptions, AssertDirectlyConstructible);
+ Assert.DoesNotContain(UnivariateDistributionType.UserDefined, selectorOptions);
+ Assert.DoesNotContain(UnivariateDistributionType.UserDefined, editorOptions);
+ }
+
+ ///
+ /// Asserts that a distribution type can be constructed without external components.
+ ///
+ /// Distribution type to validate.
+ private static void AssertDirectlyConstructible(UnivariateDistributionType type)
+ {
+ Assert.True(UnivariateDistributionFactory.TryCreateDistribution(type, out var distribution));
+ Assert.NotNull(distribution);
+ Assert.Equal(type, distribution.Type);
+ }
+}