diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.sln b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.sln new file mode 100644 index 0000000..cf0c5d2 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.sln @@ -0,0 +1,33 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31521.260 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AttachedNumericValidationBehavior", "AttachedNumericValidationBehavior\AttachedNumericValidationBehavior\AttachedNumericValidationBehavior.csproj", "{55E0B2C9-AC7E-4712-BE1D-2788098E63F2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AttachedNumericValidationBehavior.WinUI", "AttachedNumericValidationBehavior\AttachedNumericValidationBehavior.WinUI\AttachedNumericValidationBehavior.WinUI.csproj", "{F045A6EB-5EDB-407D-9452-123C230672EB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {55E0B2C9-AC7E-4712-BE1D-2788098E63F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55E0B2C9-AC7E-4712-BE1D-2788098E63F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55E0B2C9-AC7E-4712-BE1D-2788098E63F2}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {55E0B2C9-AC7E-4712-BE1D-2788098E63F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55E0B2C9-AC7E-4712-BE1D-2788098E63F2}.Release|Any CPU.Build.0 = Release|Any CPU + {55E0B2C9-AC7E-4712-BE1D-2788098E63F2}.Release|Any CPU.Deploy.0 = Release|Any CPU + {F045A6EB-5EDB-407D-9452-123C230672EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F045A6EB-5EDB-407D-9452-123C230672EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F045A6EB-5EDB-407D-9452-123C230672EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F045A6EB-5EDB-407D-9452-123C230672EB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FD7E4BAC-CCE1-4DE5-B0FF-496DC3D4CE12} + EndGlobalSection +EndGlobal diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/AttachedNumericValidationBehavior.WinUI.csproj b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/AttachedNumericValidationBehavior.WinUI.csproj new file mode 100644 index 0000000..74ab397 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/AttachedNumericValidationBehavior.WinUI.csproj @@ -0,0 +1,61 @@ + + + + net6.0-windows10.0.19041 + win-x64 + WinExe + 10.0.17763.0 + true + true + AttachedNumericValidationBehavior + + + true + MSIX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/App.xaml b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/App.xaml new file mode 100644 index 0000000..1bfa0b8 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/App.xaml @@ -0,0 +1,8 @@ + + + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/App.xaml.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/App.xaml.cs new file mode 100644 index 0000000..a7756c7 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/App.xaml.cs @@ -0,0 +1,33 @@ +using Microsoft.Maui; +using Microsoft.UI.Xaml; +using Windows.ApplicationModel; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace AttachedNumericValidationBehavior.WinUI +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + public partial class App : MauiWinUIApplication + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + } + + protected override IStartup OnCreateStartup() => new Startup(); + + protected override void OnLaunched(LaunchActivatedEventArgs args) + { + base.OnLaunched(args); + + Microsoft.Maui.Essentials.Platform.OnLaunched(args); + } + } +} diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/Package.appxmanifest b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/Package.appxmanifest new file mode 100644 index 0000000..1ba994d --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/Package.appxmanifest @@ -0,0 +1,58 @@ + + + + + + + + AttachedNumericValidationBehavior + Microsoft + Assets\appiconStoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/app.manifest b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/app.manifest new file mode 100644 index 0000000..3a48678 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Platforms/Windows/app.manifest @@ -0,0 +1,15 @@ + + + + + + + + true/PM + PerMonitorV2, PerMonitor + + + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Properties/launchSettings.json b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Properties/launchSettings.json new file mode 100644 index 0000000..dc271cf --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.WinUI/Properties/launchSettings.json @@ -0,0 +1,7 @@ +{ + "profiles": { + "AttachedNumericValidationBehavior.WinUI": { + "commandName": "MsixPackage" + } + } +} \ No newline at end of file diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/App.xaml b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/App.xaml new file mode 100644 index 0000000..c3164a6 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/App.xaml @@ -0,0 +1,7 @@ + + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/App.xaml.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/App.xaml.cs new file mode 100644 index 0000000..54990f2 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/App.xaml.cs @@ -0,0 +1,14 @@ +using Application = Microsoft.Maui.Controls.Application; + +namespace AttachedNumericValidationBehavior +{ + public partial class App : Application + { + public App() + { + InitializeComponent(); + + MainPage = new HomePage(); + } + } +} diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.csproj b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.csproj new file mode 100644 index 0000000..b6811e8 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior.csproj @@ -0,0 +1,47 @@ + + + + + net6.0-ios;net6.0-android;net6.0-maccatalyst + Exe + true + true + AttachedNumericValidationBehavior + + + AttachedNumericValidationBehavior + + + com.companyname.AttachedNumericValidationBehavior + + + 1.0 + 1 + + + + + + + + + + + + + + + + + + true + iossimulator-x64 + maccatalyst-x64 + False + + + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Behaviors/NumericValidationBehavior.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Behaviors/NumericValidationBehavior.cs new file mode 100644 index 0000000..02cbe15 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Behaviors/NumericValidationBehavior.cs @@ -0,0 +1,48 @@ +using Microsoft.Maui.Controls; +using Microsoft.Maui.Graphics; + +namespace AttachedNumericValidationBehavior +{ + public static class NumericValidationBehavior + { + public static readonly BindableProperty AttachBehaviorProperty = + BindableProperty.CreateAttached("AttachBehavior", typeof(bool), typeof(NumericValidationBehavior), false, propertyChanged: OnAttachBehaviorChanged); + + public static bool GetAttachBehavior(BindableObject view) + { + return (bool)view.GetValue(AttachBehaviorProperty); + } + + public static void SetAttachBehavior(BindableObject view, bool value) + { + view.SetValue(AttachBehaviorProperty, value); + } + + static void OnAttachBehaviorChanged(BindableObject view, object oldValue, object newValue) + { + var entry = view as Entry; + if (entry == null) + { + return; + } + + bool attachBehavior = (bool)newValue; + if (attachBehavior) + { + entry.TextChanged += OnEntryTextChanged; + } + else + { + entry.TextChanged -= OnEntryTextChanged; + } + } + + static void OnEntryTextChanged(object sender, TextChangedEventArgs args) + { + double result; + bool isValid = double.TryParse(args.NewTextValue, out result); + ((Entry)sender).TextColor = isValid ? Colors.Transparent : Colors.Red; + } + } +} + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePage.xaml b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePage.xaml new file mode 100644 index 0000000..34d843d --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePage.xaml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePage.xaml.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePage.xaml.cs new file mode 100644 index 0000000..7488518 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePage.xaml.cs @@ -0,0 +1,13 @@ +using Microsoft.Maui.Controls; + +namespace AttachedNumericValidationBehavior +{ + public partial class HomePage : TabbedPage + { + public HomePage() + { + InitializeComponent(); + } + } +} + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePageCS.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePageCS.cs new file mode 100644 index 0000000..91c4e0b --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/HomePageCS.cs @@ -0,0 +1,12 @@ +using Microsoft.Maui.Controls; + +namespace AttachedNumericValidationBehavior +{ + public class HomePageCS : TabbedPage + { + public HomePageCS () + { + Children.Add (new NumericValidationPageCS ()); + } + } +} diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPage.xaml b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPage.xaml new file mode 100644 index 0000000..2f4c1cd --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPage.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPage.xaml.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPage.xaml.cs new file mode 100644 index 0000000..fce75cc --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPage.xaml.cs @@ -0,0 +1,13 @@ +using Microsoft.Maui.Controls; + +namespace AttachedNumericValidationBehavior +{ + public partial class NumericValidationPage : ContentPage + { + public NumericValidationPage () + { + InitializeComponent (); + } + } +} + diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPageCS.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPageCS.cs new file mode 100644 index 0000000..cd20cc6 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/NumericValidationPageCS.cs @@ -0,0 +1,29 @@ +using Microsoft.Maui; +using Microsoft.Maui.Controls; + +namespace AttachedNumericValidationBehavior +{ + public class NumericValidationPageCS : ContentPage + { + public NumericValidationPageCS() + { + Title = "Numeric"; + IconImageSource = "csharp.png"; + + var entry = new Entry { Placeholder = "Enter a System.Double" }; + NumericValidationBehavior.SetAttachBehavior(entry, true); + + Content = new StackLayout + { + Padding = new Thickness(0, 20, 0, 0), + Children = { + new Label { + Text = "Red when the number isn't valid", + FontSize = Device.GetNamedSize (NamedSize.Small, typeof(Label)) + }, + entry + } + }; + } + } +} diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/AndroidManifest.xml b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/AndroidManifest.xml new file mode 100644 index 0000000..85bd4d5 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/MainActivity.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/MainActivity.cs new file mode 100644 index 0000000..50c2757 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/MainActivity.cs @@ -0,0 +1,11 @@ +using Android.App; +using Android.Content.PM; +using Microsoft.Maui; + +namespace AttachedNumericValidationBehavior +{ + [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)] + public class MainActivity : MauiAppCompatActivity + { + } +} \ No newline at end of file diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/MainApplication.cs b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/MainApplication.cs new file mode 100644 index 0000000..c8f08e4 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/MainApplication.cs @@ -0,0 +1,16 @@ +using Android.App; +using Android.Runtime; +using Microsoft.Maui; +using System; + +namespace AttachedNumericValidationBehavior +{ + [Application] + public class MainApplication : MauiApplication + { + public MainApplication(IntPtr handle, JniHandleOwnership ownership) + : base(handle, ownership) + { + } + } +} \ No newline at end of file diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/Resources/values/colors.xml b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/Resources/values/colors.xml new file mode 100644 index 0000000..c04d749 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/Resources/values/colors.xml @@ -0,0 +1,6 @@ + + + #512BD4 + #2B0B98 + #2B0B98 + \ No newline at end of file diff --git a/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/Resources/values/styles.xml b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/Resources/values/styles.xml new file mode 100644 index 0000000..b749b60 --- /dev/null +++ b/Behaviors/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/AttachedNumericValidationBehavior/Platforms/Android/Resources/values/styles.xml @@ -0,0 +1,16 @@ + + + + + +