diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.sln b/Release/v1.2.0/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.sln
new file mode 100644
index 00000000..ffc559c3
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.sln
@@ -0,0 +1,69 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFToolkit.Extended", "Src\WPFToolkit.Extended\WPFToolkit.Extended.csproj", "{72E591D6-8F83-4D8C-8F67-9C325E623234}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFToolkit.Extended.Samples", "Src\WPFToolkit.Extended.Samples\WPFToolkit.Extended.Samples.csproj", "{47B3F3DF-FAB7-4D0A-9267-109D30BF387F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFToolkit.Extended.Design", "Src\WPFToolkit.Extended.Design\WPFToolkit.Extended.Design.csproj", "{FA6645C6-7CA5-427C-91F2-916D9FECD76C}"
+EndProject
+Global
+ GlobalSection(TeamFoundationVersionControl) = preSolution
+ SccNumberOfProjects = 4
+ SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
+ SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs02
+ SccLocalPath0 = .
+ SccProjectUniqueName1 = Src\\WPFToolkit.Extended\\WPFToolkit.Extended.csproj
+ SccProjectName1 = Src/WPFToolkit.Extended
+ SccLocalPath1 = Src\\WPFToolkit.Extended
+ SccProjectUniqueName2 = Src\\WPFToolkit.Extended.Samples\\WPFToolkit.Extended.Samples.csproj
+ SccProjectName2 = Src/WPFToolkit.Extended.Samples
+ SccLocalPath2 = Src\\WPFToolkit.Extended.Samples
+ SccProjectUniqueName3 = Src\\WPFToolkit.Extended.Design\\WPFToolkit.Extended.Design.csproj
+ SccProjectName3 = Src/WPFToolkit.Extended.Design
+ SccLocalPath3 = Src\\WPFToolkit.Extended.Design
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|Mixed Platforms = Debug|Mixed Platforms
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|Mixed Platforms = Release|Mixed Platforms
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Release|Any CPU.Build.0 = Release|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Release|x86.ActiveCfg = Release|Any CPU
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Debug|x86.ActiveCfg = Debug|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Debug|x86.Build.0 = Debug|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Release|Any CPU.ActiveCfg = Release|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Release|Mixed Platforms.Build.0 = Release|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Release|x86.ActiveCfg = Release|x86
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}.Release|x86.Build.0 = Release|x86
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}.Release|x86.ActiveCfg = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.vssscc b/Release/v1.2.0/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.vssscc
new file mode 100644
index 00000000..794f014c
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/ExtendedWPFToolkit.vssscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = ""
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT"
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/MetadataStore.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/MetadataStore.cs
new file mode 100644
index 00000000..d59e48ab
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/MetadataStore.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.Windows.Design.Metadata;
+using Microsoft.Windows.Controls;
+using Microsoft.Windows.Design.Features;
+using System.ComponentModel;
+
+[assembly: ProvideMetadata(typeof(WPFToolkit.Extended.Design.MetadataStore))]
+
+namespace WPFToolkit.Extended.Design
+{
+ internal class MetadataStore : IProvideAttributeTable
+ {
+ public AttributeTable AttributeTable
+ {
+ get
+ {
+ AttributeTableBuilder builder = new AttributeTableBuilder();
+
+
+ //builder.AddCustomAttributes(typeof(NumericUpDown), new FeatureAttribute(typeof(NumericUpDownEditor)));
+ builder.AddCustomAttributes(typeof(NumericUpDown), "Increment",
+ new DescriptionAttribute("Specifies the amount in which to increment the value."),
+ new DisplayNameAttribute("Increment"));
+
+ builder.AddCustomAttributes(typeof(NumericUpDown), "IsEditable",
+ new DescriptionAttribute("Determines if direct entry is allowed in the text box."),
+ new DisplayNameAttribute("IsEditable"));
+
+ builder.AddCustomAttributes(typeof(NumericUpDown), "Maximum",
+ new DescriptionAttribute("Gets/Sets the maximum allowed value."),
+ new DisplayNameAttribute("Maximum"));
+
+ builder.AddCustomAttributes(typeof(NumericUpDown), "Minimum",
+ new DescriptionAttribute("Gets/Sets the minimum allowed value."),
+ new DisplayNameAttribute("Minimum"));
+
+ builder.AddCustomAttributes(typeof(NumericUpDown), "Text",
+ new DescriptionAttribute("Gets/Sets the formated string representation of the value."),
+ new DisplayNameAttribute("Text"));
+
+ builder.AddCustomAttributes(typeof(NumericUpDown), "Value",
+ new DescriptionAttribute("Gets/Sets the numeric value."),
+ new DisplayNameAttribute("Value"));
+
+ return builder.CreateTable();
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/AssemblyInfo.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..5b13e861
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("WPFToolkit.Extended.Design")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("WPFToolkit.Extended.Design")]
+[assembly: AssemblyCopyright("Copyright © 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Resources.Designer.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..7ef72466
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace WPFToolkit.Extended.Design.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WPFToolkit.Extended.Design.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Resources.resx b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Resources.resx
new file mode 100644
index 00000000..ffecec85
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Settings.Designer.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..72d80d66
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace WPFToolkit.Extended.Design.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Settings.settings b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Settings.settings
new file mode 100644
index 00000000..8f2fd95d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/WPFToolkit.Extended.Design.csproj b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/WPFToolkit.Extended.Design.csproj
new file mode 100644
index 00000000..fd0fa3fa
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/WPFToolkit.Extended.Design.csproj
@@ -0,0 +1,99 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {FA6645C6-7CA5-427C-91F2-916D9FECD76C}
+ library
+ Properties
+ WPFToolkit.Extended.Design
+ WPFToolkit.Extended.Design
+ v4.0
+ Client
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ true
+ full
+ false
+ ..\WPFToolkit.Extended\bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ ..\WPFToolkit.Extended\bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}
+ WPFToolkit.Extended
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/WPFToolkit.Extended.Design.csproj.vspscc b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/WPFToolkit.Extended.Design.csproj.vspscc
new file mode 100644
index 00000000..feffdeca
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Design/WPFToolkit.Extended.Design.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = ""
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/App.xaml b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/App.xaml
new file mode 100644
index 00000000..00767c6d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/App.xaml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/App.xaml.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/App.xaml.cs
new file mode 100644
index 00000000..f0cfc9e7
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/App.xaml.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Windows;
+
+namespace WPFToolkit.Extended.Samples
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/MainWindow.xaml b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/MainWindow.xaml
new file mode 100644
index 00000000..0f66d220
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/MainWindow.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/MainWindow.xaml.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/MainWindow.xaml.cs
new file mode 100644
index 00000000..f28170f3
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/MainWindow.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace WPFToolkit.Extended.Samples
+{
+ ///
+ /// Interaction logic for MainWindow.xaml
+ ///
+ public partial class MainWindow : Window
+ {
+ public MainWindow()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/AssemblyInfo.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..35e4c7aa
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("WPFToolkit.Extended.Samples")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("WPFToolkit.Extended.Samples")]
+[assembly: AssemblyCopyright("Copyright © 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Resources.Designer.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..3c757353
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace WPFToolkit.Extended.Samples.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WPFToolkit.Extended.Samples.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Resources.resx b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Resources.resx
new file mode 100644
index 00000000..ffecec85
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Settings.Designer.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..a353c3db
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace WPFToolkit.Extended.Samples.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Settings.settings b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Settings.settings
new file mode 100644
index 00000000..8f2fd95d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/WPFToolkit.Extended.Samples.csproj b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/WPFToolkit.Extended.Samples.csproj
new file mode 100644
index 00000000..e49eab24
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/WPFToolkit.Extended.Samples.csproj
@@ -0,0 +1,113 @@
+
+
+
+ Debug
+ x86
+ 8.0.30703
+ 2.0
+ {47B3F3DF-FAB7-4D0A-9267-109D30BF387F}
+ WinExe
+ Properties
+ WPFToolkit.Extended.Samples
+ WPFToolkit.Extended.Samples
+ v4.0
+ Client
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ x86
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ x86
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+ MainWindow.xaml
+ Code
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}
+ WPFToolkit.Extended
+
+
+
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/WPFToolkit.Extended.Samples.csproj.vspscc b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/WPFToolkit.Extended.Samples.csproj.vspscc
new file mode 100644
index 00000000..feffdeca
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended.Samples/WPFToolkit.Extended.Samples.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = ""
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/BusyIndicator/BusyIndicator.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/BusyIndicator/BusyIndicator.cs
new file mode 100644
index 00000000..6a73cd8f
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/BusyIndicator/BusyIndicator.cs
@@ -0,0 +1,266 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Shapes;
+using System.Windows.Threading;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// A control to provide a visual indicator when an application is busy.
+ ///
+ [TemplateVisualState(Name = VisualStates.StateIdle, GroupName = VisualStates.GroupBusyStatus)]
+ [TemplateVisualState(Name = VisualStates.StateBusy, GroupName = VisualStates.GroupBusyStatus)]
+ [TemplateVisualState(Name = VisualStates.StateVisible, GroupName = VisualStates.GroupVisibility)]
+ [TemplateVisualState(Name = VisualStates.StateHidden, GroupName = VisualStates.GroupVisibility)]
+ [StyleTypedProperty(Property = "OverlayStyle", StyleTargetType = typeof(Rectangle))]
+ [StyleTypedProperty(Property = "ProgressBarStyle", StyleTargetType = typeof(ProgressBar))]
+ public class BusyIndicator : ContentControl
+ {
+ #region Private Members
+
+ ///
+ /// Timer used to delay the initial display and avoid flickering.
+ ///
+ private DispatcherTimer _displayAfterTimer = new DispatcherTimer();
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static BusyIndicator()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(BusyIndicator), new FrameworkPropertyMetadata(typeof(BusyIndicator)));
+ }
+
+ public BusyIndicator()
+ {
+ _displayAfterTimer.Tick += DisplayAfterTimerElapsed;
+ }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ ///
+ /// Overrides the OnApplyTemplate method.
+ ///
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+ ChangeVisualState(false);
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Properties
+
+ ///
+ /// Gets or sets a value indicating whether the BusyContent is visible.
+ ///
+ protected bool IsContentVisible { get; set; }
+
+ #endregion //Properties
+
+ #region Dependency Properties
+
+ #region IsBusy
+
+ ///
+ /// Identifies the IsBusy dependency property.
+ ///
+ public static readonly DependencyProperty IsBusyProperty = DependencyProperty.Register(
+ "IsBusy",
+ typeof(bool),
+ typeof(BusyIndicator),
+ new PropertyMetadata(false, new PropertyChangedCallback(OnIsBusyChanged)));
+
+ ///
+ /// Gets or sets a value indicating whether the busy indicator should show.
+ ///
+ public bool IsBusy
+ {
+ get { return (bool)GetValue(IsBusyProperty); }
+ set { SetValue(IsBusyProperty, value); }
+ }
+
+ ///
+ /// IsBusyProperty property changed handler.
+ ///
+ /// BusyIndicator that changed its IsBusy.
+ /// Event arguments.
+ private static void OnIsBusyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ((BusyIndicator)d).OnIsBusyChanged(e);
+ }
+
+ ///
+ /// IsBusyProperty property changed handler.
+ ///
+ /// Event arguments.
+ protected virtual void OnIsBusyChanged(DependencyPropertyChangedEventArgs e)
+ {
+ if (IsBusy)
+ {
+ if (DisplayAfter.Equals(TimeSpan.Zero))
+ {
+ // Go visible now
+ IsContentVisible = true;
+ }
+ else
+ {
+ // Set a timer to go visible
+ _displayAfterTimer.Interval = DisplayAfter;
+ _displayAfterTimer.Start();
+ }
+ }
+ else
+ {
+ // No longer visible
+ _displayAfterTimer.Stop();
+ IsContentVisible = false;
+ }
+
+ ChangeVisualState(true);
+ }
+
+ #endregion //IsBusy
+
+ #region Busy Content
+
+ ///
+ /// Identifies the BusyContent dependency property.
+ ///
+ public static readonly DependencyProperty BusyContentProperty = DependencyProperty.Register(
+ "BusyContent",
+ typeof(object),
+ typeof(BusyIndicator),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets a value indicating the busy content to display to the user.
+ ///
+ public object BusyContent
+ {
+ get { return (object)GetValue(BusyContentProperty); }
+ set { SetValue(BusyContentProperty, value); }
+ }
+
+ #endregion //Busy Content
+
+ #region Busy Content Template
+
+ ///
+ /// Identifies the BusyTemplate dependency property.
+ ///
+ public static readonly DependencyProperty BusyContentTemplateProperty = DependencyProperty.Register(
+ "BusyContentTemplate",
+ typeof(DataTemplate),
+ typeof(BusyIndicator),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets a value indicating the template to use for displaying the busy content to the user.
+ ///
+ public DataTemplate BusyContentTemplate
+ {
+ get { return (DataTemplate)GetValue(BusyContentTemplateProperty); }
+ set { SetValue(BusyContentTemplateProperty, value); }
+ }
+
+ #endregion //Busy Content Template
+
+ #region Display After
+
+ ///
+ /// Identifies the DisplayAfter dependency property.
+ ///
+ public static readonly DependencyProperty DisplayAfterProperty = DependencyProperty.Register(
+ "DisplayAfter",
+ typeof(TimeSpan),
+ typeof(BusyIndicator),
+ new PropertyMetadata(TimeSpan.FromSeconds(0.1)));
+
+ ///
+ /// Gets or sets a value indicating how long to delay before displaying the busy content.
+ ///
+ public TimeSpan DisplayAfter
+ {
+ get { return (TimeSpan)GetValue(DisplayAfterProperty); }
+ set { SetValue(DisplayAfterProperty, value); }
+ }
+
+ #endregion //Display After
+
+ #region Overlay Style
+
+ ///
+ /// Identifies the OverlayStyle dependency property.
+ ///
+ public static readonly DependencyProperty OverlayStyleProperty = DependencyProperty.Register(
+ "OverlayStyle",
+ typeof(Style),
+ typeof(BusyIndicator),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets a value indicating the style to use for the overlay.
+ ///
+ public Style OverlayStyle
+ {
+ get { return (Style)GetValue(OverlayStyleProperty); }
+ set { SetValue(OverlayStyleProperty, value); }
+ }
+ #endregion //Overlay Style
+
+ #region ProgressBar Style
+
+ ///
+ /// Identifies the ProgressBarStyle dependency property.
+ ///
+ public static readonly DependencyProperty ProgressBarStyleProperty = DependencyProperty.Register(
+ "ProgressBarStyle",
+ typeof(Style),
+ typeof(BusyIndicator),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets a value indicating the style to use for the progress bar.
+ ///
+ public Style ProgressBarStyle
+ {
+ get { return (Style)GetValue(ProgressBarStyleProperty); }
+ set { SetValue(ProgressBarStyleProperty, value); }
+ }
+
+ #endregion //ProgressBar Style
+
+ #endregion //Dependency Properties
+
+ #region Methods
+
+ ///
+ /// Handler for the DisplayAfterTimer.
+ ///
+ /// Event sender.
+ /// Event arguments.
+ private void DisplayAfterTimerElapsed(object sender, EventArgs e)
+ {
+ _displayAfterTimer.Stop();
+ IsContentVisible = true;
+ ChangeVisualState(true);
+ }
+
+ ///
+ /// Changes the control's visual state(s).
+ ///
+ /// True if state transitions should be used.
+ protected virtual void ChangeVisualState(bool useTransitions)
+ {
+ VisualStateManager.GoToState(this, IsBusy ? VisualStates.StateBusy : VisualStates.StateIdle, useTransitions);
+ VisualStateManager.GoToState(this, IsContentVisible ? VisualStates.StateVisible : VisualStates.StateHidden, useTransitions);
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/BusyIndicator/VisualStates.BusyIndicator.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/BusyIndicator/VisualStates.BusyIndicator.cs
new file mode 100644
index 00000000..5d78d952
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/BusyIndicator/VisualStates.BusyIndicator.cs
@@ -0,0 +1,37 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static partial class VisualStates
+ {
+ ///
+ /// Busyness group name.
+ ///
+ public const string GroupBusyStatus = "BusyStatusStates";
+
+ ///
+ /// Busy state for BusyIndicator.
+ ///
+ public const string StateBusy = "Busy";
+
+ ///
+ /// Idle state for BusyIndicator.
+ ///
+ public const string StateIdle = "Idle";
+
+ ///
+ /// BusyDisplay group.
+ ///
+ public const string GroupVisibility = "VisibilityStates";
+
+ ///
+ /// Visible state name for BusyIndicator.
+ ///
+ public const string StateVisible = "Visible";
+
+ ///
+ /// Hidden state name for BusyIndicator.
+ ///
+ public const string StateHidden = "Hidden";
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/ButtonSpinner.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/ButtonSpinner.cs
new file mode 100644
index 00000000..b2c2ad99
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/ButtonSpinner.cs
@@ -0,0 +1,191 @@
+using System;
+using System.Windows;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Controls.Primitives;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Represents a spinner control that includes two Buttons.
+ ///
+ [ContentProperty("Content")]
+ public class ButtonSpinner : Spinner
+ {
+ #region Properties
+
+ #region Content
+
+ ///
+ /// Identifies the Content dependency property.
+ ///
+ public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(ButtonSpinner), new PropertyMetadata(null, OnContentPropertyChanged));
+ public object Content
+ {
+ get { return GetValue(ContentProperty) as object; }
+ set { SetValue(ContentProperty, value); }
+ }
+
+ ///
+ /// ContentProperty property changed handler.
+ ///
+ /// ButtonSpinner that changed its Content.
+ /// Event arguments.
+ private static void OnContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ButtonSpinner source = d as ButtonSpinner;
+ source.OnContentChanged(e.OldValue, e.NewValue);
+ }
+
+ #endregion //Content
+
+ private ButtonBase _increaseButton;
+ ///
+ /// Gets or sets the IncreaseButton template part.
+ ///
+ private ButtonBase IncreaseButton
+ {
+ get { return _increaseButton; }
+ set
+ {
+ if (_increaseButton != null)
+ {
+ _increaseButton.Click -= OnButtonClick;
+ }
+
+ _increaseButton = value;
+
+ if (_increaseButton != null)
+ {
+ _increaseButton.Click += OnButtonClick;
+ }
+ }
+ }
+
+
+ private ButtonBase _decreaseButton;
+ ///
+ /// Gets or sets the DecreaseButton template part.
+ ///
+ private ButtonBase DecreaseButton
+ {
+ get { return _decreaseButton; }
+ set
+ {
+ if (_decreaseButton != null)
+ {
+ _decreaseButton.Click -= OnButtonClick;
+ }
+
+ _decreaseButton = value;
+
+ if (_decreaseButton != null)
+ {
+ _decreaseButton.Click += OnButtonClick;
+ }
+ }
+ }
+
+ #endregion //Properties
+
+ #region Constructors
+
+ static ButtonSpinner()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonSpinner), new FrameworkPropertyMetadata(typeof(ButtonSpinner)));
+ }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ IncreaseButton = GetTemplateChild("IncreaseButton") as ButtonBase;
+ DecreaseButton = GetTemplateChild("DecreaseButton") as ButtonBase;
+
+ SetButtonUsage();
+ }
+
+ #endregion //Base Class Overrides
+
+ ///
+ /// Occurs when the Content property value changed.
+ ///
+ /// The old value of the Content property.
+ /// The new value of the Content property.
+ protected virtual void OnContentChanged(object oldValue, object newValue) { }
+
+ ///
+ /// Handle click event of IncreaseButton and DecreaseButton template parts,
+ /// translating Click to appropriate Spin event.
+ ///
+ /// Event sender, should be either IncreaseButton or DecreaseButton template part.
+ /// Event args.
+ private void OnButtonClick(object sender, RoutedEventArgs e)
+ {
+ SpinDirection direction = sender == IncreaseButton ? SpinDirection.Increase : SpinDirection.Decrease;
+ OnSpin(new SpinEventArgs(direction));
+ }
+
+ ///
+ /// Cancel LeftMouseButtonUp events originating from a button that has
+ /// been changed to disabled.
+ ///
+ /// The data for the event.
+ protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
+ {
+ base.OnMouseLeftButtonUp(e);
+
+ Point mousePosition;
+ if (IncreaseButton != null && IncreaseButton.IsEnabled == false)
+ {
+ mousePosition = e.GetPosition(IncreaseButton);
+ if (mousePosition.X > 0 && mousePosition.X < IncreaseButton.ActualWidth &&
+ mousePosition.Y > 0 && mousePosition.Y < IncreaseButton.ActualHeight)
+ {
+ e.Handled = true;
+ }
+ }
+
+ if (DecreaseButton != null && DecreaseButton.IsEnabled == false)
+ {
+ mousePosition = e.GetPosition(DecreaseButton);
+ if (mousePosition.X > 0 && mousePosition.X < DecreaseButton.ActualWidth &&
+ mousePosition.Y > 0 && mousePosition.Y < DecreaseButton.ActualHeight)
+ {
+ e.Handled = true;
+ }
+ }
+ }
+
+ ///
+ /// Called when valid spin direction changed.
+ ///
+ /// The old value.
+ /// The new value.
+ protected override void OnValidSpinDirectionChanged(ValidSpinDirections oldValue, ValidSpinDirections newValue)
+ {
+ SetButtonUsage();
+ }
+
+ ///
+ /// Disables or enables the buttons based on the valid spin direction.
+ ///
+ private void SetButtonUsage()
+ {
+ // buttonspinner adds buttons that spin, so disable accordingly.
+ if (IncreaseButton != null)
+ {
+ IncreaseButton.IsEnabled = ((ValidSpinDirection & ValidSpinDirections.Increase) == ValidSpinDirections.Increase);
+ }
+
+ if (DecreaseButton != null)
+ {
+ DecreaseButton.IsEnabled = ((ValidSpinDirection & ValidSpinDirections.Decrease) == ValidSpinDirections.Decrease);
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/SpinDirection.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/SpinDirection.cs
new file mode 100644
index 00000000..aaa121fb
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/SpinDirection.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Represents spin directions that could be initiated by the end-user.
+ ///
+ /// Preview
+ public enum SpinDirection
+ {
+ ///
+ /// Represents a spin initiated by the end-user in order to Increase a value.
+ ///
+ Increase = 0,
+
+ ///
+ /// Represents a spin initiated by the end-user in order to Decrease a value.
+ ///
+ Decrease = 1
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/SpinEventArgs.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/SpinEventArgs.cs
new file mode 100644
index 00000000..f8a89385
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/SpinEventArgs.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Provides data for the Spinner.Spin event.
+ ///
+ /// Preview
+ public class SpinEventArgs : RoutedEventArgs
+ {
+ ///
+ /// Gets the SpinDirection for the spin that has been initiated by the
+ /// end-user.
+ ///
+ public SpinDirection Direction { get; private set; }
+
+ ///
+ /// Initializes a new instance of the SpinEventArgs class.
+ ///
+ /// Spin direction.
+ public SpinEventArgs(SpinDirection direction)
+ : base()
+ {
+ Direction = direction;
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/Spinner.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/Spinner.cs
new file mode 100644
index 00000000..20b8d1cb
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/Spinner.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Windows.Controls;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Base class for controls that represents controls that can spin.
+ ///
+ public abstract class Spinner : Control
+ {
+ #region Properties
+
+ ///
+ /// Identifies the ValidSpinDirection dependency property.
+ ///
+ public static readonly DependencyProperty ValidSpinDirectionProperty = DependencyProperty.Register("ValidSpinDirection", typeof(ValidSpinDirections), typeof(Spinner), new PropertyMetadata(ValidSpinDirections.Increase | ValidSpinDirections.Decrease, OnValidSpinDirectionPropertyChanged));
+ public ValidSpinDirections ValidSpinDirection
+ {
+ get { return (ValidSpinDirections)GetValue(ValidSpinDirectionProperty); }
+ set { SetValue(ValidSpinDirectionProperty, value); }
+ }
+
+ ///
+ /// ValidSpinDirectionProperty property changed handler.
+ ///
+ /// ButtonSpinner that changed its ValidSpinDirection.
+ /// Event arguments.
+ private static void OnValidSpinDirectionPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ Spinner source = (Spinner)d;
+ ValidSpinDirections oldvalue = (ValidSpinDirections)e.OldValue;
+ ValidSpinDirections newvalue = (ValidSpinDirections)e.NewValue;
+ source.OnValidSpinDirectionChanged(oldvalue, newvalue);
+ }
+
+ #endregion //Properties
+
+ ///
+ /// Occurs when spinning is initiated by the end-user.
+ ///
+ public event EventHandler Spin;
+
+ ///
+ /// Initializes a new instance of the Spinner class.
+ ///
+ protected Spinner() { }
+
+ ///
+ /// Raises the OnSpin event when spinning is initiated by the end-user.
+ ///
+ /// Spin event args.
+ protected virtual void OnSpin(SpinEventArgs e)
+ {
+ ValidSpinDirections valid = e.Direction == SpinDirection.Increase ? ValidSpinDirections.Increase : ValidSpinDirections.Decrease;
+
+ if ((ValidSpinDirection & valid) != valid)
+ {
+ // spin is not allowed.
+ throw new InvalidOperationException("Spin action is not valid at this moment.");
+ }
+
+ EventHandler handler = Spin;
+ if (handler != null)
+ {
+ handler(this, e);
+ }
+ }
+
+ ///
+ /// Called when valid spin direction changed.
+ ///
+ /// The old value.
+ /// The new value.
+ protected virtual void OnValidSpinDirectionChanged(ValidSpinDirections oldValue, ValidSpinDirections newValue) { }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/ValidSpinDirections.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/ValidSpinDirections.cs
new file mode 100644
index 00000000..d744620d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ButtonSpinner/ValidSpinDirections.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Represents spin directions that are valid.
+ ///
+ [Flags]
+ public enum ValidSpinDirections
+ {
+ ///
+ /// Can not increase nor decrease.
+ ///
+ None = 0,
+
+ ///
+ /// Can increase.
+ ///
+ Increase = 1,
+
+ ///
+ /// Can decrease.
+ ///
+ Decrease = 2
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/ChildWindow.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/ChildWindow.cs
new file mode 100644
index 00000000..8a44695d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/ChildWindow.cs
@@ -0,0 +1,482 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Controls.Primitives;
+using System.ComponentModel;
+
+namespace Microsoft.Windows.Controls
+{
+ [TemplateVisualState(GroupName = VisualStates.WindowStatesGroup, Name = VisualStates.Open)]
+ [TemplateVisualState(GroupName = VisualStates.WindowStatesGroup, Name = VisualStates.Closed)]
+ public class ChildWindow : ContentControl
+ {
+ #region Private Members
+
+ private TranslateTransform _moveTransform = new TranslateTransform();
+ private bool _startupPositionInitialized;
+ private bool _isMouseCaptured;
+ private Point _clickPoint;
+ private Point _oldPosition;
+ private Border _dragWidget;
+ private FrameworkElement _parent;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static ChildWindow()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ChildWindow), new FrameworkPropertyMetadata(typeof(ChildWindow)));
+ }
+
+ public ChildWindow()
+ {
+ LayoutUpdated += (o, e) =>
+ {
+ //we only want to set the start position if this is the first time the control has bee initialized
+ if (!_startupPositionInitialized)
+ {
+ SetStartupPosition();
+ _startupPositionInitialized = true;
+ }
+ };
+ }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ _dragWidget = (Border)GetTemplateChild("PART_DragWidget");
+ if (_dragWidget != null)
+ {
+ _dragWidget.AddHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(HeaderLeftMouseButtonDown), true);
+ _dragWidget.AddHandler(UIElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(HeaderMouseLeftButtonUp), true);
+ _dragWidget.MouseMove += (o, e) => HeaderMouseMove(e);
+ }
+
+ CloseButton = (Button)GetTemplateChild("PART_CloseButton");
+ if (CloseButton != null)
+ CloseButton.Click += (o, e) => Close();
+
+ Overlay = GetTemplateChild("PART_Overlay") as Panel;
+ WindowRoot = GetTemplateChild("PART_WindowRoot") as Grid;
+
+ WindowRoot.RenderTransform = _moveTransform;
+
+ //TODO: move somewhere else
+ _parent = VisualTreeHelper.GetParent(this) as FrameworkElement;
+ _parent.SizeChanged += (o, ea) =>
+ {
+ Overlay.Height = ea.NewSize.Height;
+ Overlay.Width = ea.NewSize.Width;
+ };
+
+ ChangeVisualState();
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Properties
+
+ #region Internal Properties
+
+ internal Panel Overlay { get; private set; }
+ internal Grid WindowRoot { get; private set; }
+ internal Thumb DragWidget { get; private set; }
+ internal Button MinimizeButton { get; private set; }
+ internal Button MaximizeButton { get; private set; }
+ internal Button CloseButton { get; private set; }
+
+ #endregion //Internal Properties
+
+ #region Dependency Properties
+
+ public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(ChildWindow), new UIPropertyMetadata(String.Empty));
+ public string Caption
+ {
+ get { return (string)GetValue(CaptionProperty); }
+ set { SetValue(CaptionProperty, value); }
+ }
+
+ public static readonly DependencyProperty CaptionForegroundProperty = DependencyProperty.Register("CaptionForeground", typeof(Brush), typeof(ChildWindow), new UIPropertyMetadata(null));
+ public Brush CaptionForeground
+ {
+ get { return (Brush)GetValue(CaptionForegroundProperty); }
+ set { SetValue(CaptionForegroundProperty, value); }
+ }
+
+ public static readonly DependencyProperty CloseButtonStyleProperty = DependencyProperty.Register("CloseButtonStyle", typeof(Style), typeof(ChildWindow), new PropertyMetadata(null));
+ public Style CloseButtonStyle
+ {
+ get { return (Style)GetValue(CloseButtonStyleProperty); }
+ set { SetValue(CloseButtonStyleProperty, value); }
+ }
+
+ public static readonly DependencyProperty CloseButtonVisibilityProperty = DependencyProperty.Register("CloseButtonVisibility", typeof(Visibility), typeof(ChildWindow), new PropertyMetadata(Visibility.Visible));
+ public Visibility CloseButtonVisibility
+ {
+ get { return (Visibility)GetValue(CloseButtonVisibilityProperty); }
+ set { SetValue(CloseButtonVisibilityProperty, value); }
+ }
+
+ public static readonly DependencyProperty IconSourceProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(ChildWindow), new UIPropertyMetadata(default(ImageSource)));
+ public ImageSource Icon
+ {
+ get { return (ImageSource)GetValue(IconSourceProperty); }
+ set { SetValue(IconSourceProperty, value); }
+ }
+
+ public static readonly DependencyProperty IsModalProperty = DependencyProperty.Register("IsModal", typeof(bool), typeof(ChildWindow), new UIPropertyMetadata(true));
+ public bool IsModal
+ {
+ get { return (bool)GetValue(IsModalProperty); }
+ set { SetValue(IsModalProperty, value); }
+ }
+
+ #region Left
+
+ public static readonly DependencyProperty LeftProperty = DependencyProperty.Register("Left", typeof(double), typeof(ChildWindow), new PropertyMetadata(0.0, new PropertyChangedCallback(OnLeftPropertyChanged)));
+ public double Left
+ {
+ get { return (double)GetValue(LeftProperty); }
+ set { SetValue(LeftProperty, value); }
+ }
+
+ private static void OnLeftPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ ChildWindow window = (ChildWindow)obj;
+ window.Left = window.GetRestrictedLeft();
+ window.ProcessMove((double)e.NewValue - (double)e.OldValue, 0);
+ }
+
+ #endregion //Left
+
+ #region OverlayBrush
+
+ public static readonly DependencyProperty OverlayBrushProperty = DependencyProperty.Register("OverlayBrush", typeof(Brush), typeof(ChildWindow));
+ public Brush OverlayBrush
+ {
+ get { return (Brush)GetValue(OverlayBrushProperty); }
+ set { SetValue(OverlayBrushProperty, value); }
+ }
+
+ #endregion //OverlayBrush
+
+ #region OverlayOpacity
+
+ public static readonly DependencyProperty OverlayOpacityProperty = DependencyProperty.Register("OverlayOpacity", typeof(double), typeof(ChildWindow));
+ public double OverlayOpacity
+ {
+ get { return (double)GetValue(OverlayOpacityProperty); }
+ set { SetValue(OverlayOpacityProperty, value); }
+ }
+
+ #endregion //OverlayOpacity
+
+ #region Top
+
+ public static readonly DependencyProperty TopProperty = DependencyProperty.Register("Top", typeof(double), typeof(ChildWindow), new PropertyMetadata(0.0, new PropertyChangedCallback(OnTopPropertyChanged)));
+ public double Top
+ {
+ get { return (double)GetValue(TopProperty); }
+ set { SetValue(TopProperty, value); }
+ }
+
+ private static void OnTopPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ ChildWindow window = (ChildWindow)obj;
+ window.Top = window.GetRestrictedTop();
+ window.ProcessMove(0, (double)e.NewValue - (double)e.OldValue);
+ }
+
+ #endregion //TopProperty
+
+ public static readonly DependencyProperty WindowBackgroundProperty = DependencyProperty.Register("WindowBackground", typeof(Brush), typeof(ChildWindow), new PropertyMetadata(null));
+ public Brush WindowBackground
+ {
+ get { return (Brush)GetValue(WindowBackgroundProperty); }
+ set { SetValue(WindowBackgroundProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowBorderBrushProperty = DependencyProperty.Register("WindowBorderBrush", typeof(Brush), typeof(ChildWindow), new PropertyMetadata(null));
+ public Brush WindowBorderBrush
+ {
+ get { return (Brush)GetValue(WindowBorderBrushProperty); }
+ set { SetValue(WindowBorderBrushProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowOpacityProperty = DependencyProperty.Register("WindowOpacity", typeof(double), typeof(ChildWindow), new PropertyMetadata(null));
+ public double WindowOpacity
+ {
+ get { return (double)GetValue(WindowOpacityProperty); }
+ set { SetValue(WindowOpacityProperty, value); }
+ }
+
+ #region WindowState
+
+ public static readonly DependencyProperty WindowStateProperty = DependencyProperty.Register("WindowState", typeof(WindowState), typeof(ChildWindow), new PropertyMetadata(WindowState.Open, new PropertyChangedCallback(OnWindowStatePropertyChanged)));
+ public WindowState WindowState
+ {
+ get { return (WindowState)GetValue(WindowStateProperty); }
+ set { SetValue(WindowStateProperty, value); }
+ }
+
+ private static void OnWindowStatePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ ChildWindow window = (ChildWindow)obj;
+ window.SetWindowState((WindowState)e.NewValue);
+ }
+
+ #endregion //WindowState
+
+ #endregion //Dependency Properties
+
+ private bool? _dialogResult;
+ ///
+ /// Gets or sets a value indicating whether the ChildWindow was accepted or canceled.
+ ///
+ ///
+ /// True if the child window was accepted; false if the child window was
+ /// canceled. The default is null.
+ ///
+ [TypeConverter(typeof(NullableBoolConverter))]
+ public bool? DialogResult
+ {
+ get { return _dialogResult; }
+ set
+ {
+ if (_dialogResult != value)
+ {
+ _dialogResult = value;
+ Close();
+ }
+ }
+ }
+
+ #endregion //Properties
+
+ #region Event Handlers
+
+ void HeaderLeftMouseButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ e.Handled = true;
+ Focus();
+ _dragWidget.CaptureMouse();
+ _isMouseCaptured = true;
+ _clickPoint = e.GetPosition(null); //save off the mouse position
+ _oldPosition = new Point(Left, Top); //save off our original window position
+ }
+
+ private void HeaderMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ e.Handled = true;
+ _dragWidget.ReleaseMouseCapture();
+ _isMouseCaptured = false;
+ }
+
+ private void HeaderMouseMove(MouseEventArgs e)
+ {
+ if (_isMouseCaptured && Visibility == Visibility.Visible)
+ {
+ Point currentPosition = e.GetPosition(null); //our current mouse position
+
+ Left = _oldPosition.X + (currentPosition.X - _clickPoint.X);
+ Top = _oldPosition.Y + (currentPosition.Y - _clickPoint.Y);
+
+ //this helps keep our mouse position in sync with the drag widget position
+ Point dragWidgetPosition = e.GetPosition(_dragWidget);
+ if (dragWidgetPosition.X < 0 || dragWidgetPosition.X > _dragWidget.ActualWidth || dragWidgetPosition.Y < 0 || dragWidgetPosition.Y > _dragWidget.ActualHeight)
+ {
+ return;
+ }
+
+ _oldPosition = new Point(Left, Top);
+ _clickPoint = e.GetPosition(Window.GetWindow(this)); //store the point where we are relative to the window
+ }
+ }
+
+ #endregion //Event Handlers
+
+ #region Methods
+
+ #region Private
+
+ private double GetRestrictedLeft()
+ {
+ if (_parent != null)
+ {
+ if (Left < 0)
+ {
+ return 0;
+ }
+
+ if (Left + WindowRoot.ActualWidth > _parent.ActualWidth)
+ {
+ return _parent.ActualWidth - WindowRoot.ActualWidth;
+ }
+ }
+
+ return Left;
+ }
+
+ private double GetRestrictedTop()
+ {
+ if (_parent != null)
+ {
+ if (Top < 0)
+ {
+ return 0;
+ }
+
+ if (Top + WindowRoot.ActualHeight > _parent.ActualHeight)
+ {
+ return _parent.ActualHeight - WindowRoot.ActualHeight;
+ }
+ }
+
+ return Top;
+ }
+
+ private void SetWindowState(WindowState state)
+ {
+ switch (state)
+ {
+ case WindowState.Closed:
+ {
+ ExecuteClose();
+ break;
+ }
+ case WindowState.Open:
+ {
+ ExecuteOpen();
+ break;
+ }
+ }
+
+ ChangeVisualState();
+ }
+
+ private void ExecuteClose()
+ {
+ CancelEventArgs e = new CancelEventArgs();
+ OnClosing(e);
+
+ if (!e.Cancel)
+ {
+ if (!_dialogResult.HasValue)
+ _dialogResult = false;
+
+ OnClosed(EventArgs.Empty);
+ }
+ else
+ {
+ _dialogResult = null; //if the Close is cancelled, DialogResult should always be NULL:
+ }
+ }
+
+ private void ExecuteOpen()
+ {
+ _dialogResult = null; //reset the dialogResult to null each time the window is opened
+ SetZIndex();
+ }
+
+ private void SetZIndex()
+ {
+ if (_parent != null)
+ {
+ int parentIndex = (int)_parent.GetValue(Canvas.ZIndexProperty);
+ this.SetValue(Canvas.ZIndexProperty, ++parentIndex);
+ }
+ else
+ {
+ this.SetValue(Canvas.ZIndexProperty, 1);
+ }
+ }
+
+ private void SetStartupPosition()
+ {
+ CenterChildWindow();
+ }
+
+ private void CenterChildWindow()
+ {
+ _moveTransform.X = _moveTransform.Y = 0;
+
+ if (_parent != null)
+ {
+ Left = (_parent.ActualWidth - WindowRoot.ActualWidth) / 2.0;
+ Top = (_parent.ActualHeight - WindowRoot.ActualHeight) / 2.0;
+ }
+ }
+
+ protected virtual void ChangeVisualState()
+ {
+ if (WindowState == WindowState.Closed)
+ {
+ VisualStateManager.GoToState(this, VisualStates.Closed, true);
+ }
+ else
+ {
+ VisualStateManager.GoToState(this, VisualStates.Open, true);
+ }
+ }
+
+ #endregion //Private
+
+ #region Protected
+
+ protected void ProcessMove(double x, double y)
+ {
+ _moveTransform.X += x;
+ _moveTransform.Y += y;
+ }
+
+ #endregion //Protected
+
+ #region Public
+
+ public void Show()
+ {
+ WindowState = WindowState.Open;
+ }
+
+ public void Close()
+ {
+ WindowState = WindowState.Closed;
+ }
+
+ #endregion //Public
+
+ #endregion //Methods
+
+ #region Events
+
+ ///
+ /// Occurs when the ChildWindow is closed.
+ ///
+ public event EventHandler Closed;
+ protected virtual void OnClosed(EventArgs e)
+ {
+ if (Closed != null)
+ Closed(this, e);
+ }
+
+ ///
+ /// Occurs when the ChildWindow is closing.
+ ///
+ public event EventHandler Closing;
+ protected virtual void OnClosing(CancelEventArgs e)
+ {
+ if (Closing != null)
+ Closing(this, e);
+ }
+
+ #endregion //Events
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/VisualStates.ChildWindow.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/VisualStates.ChildWindow.cs
new file mode 100644
index 00000000..eb3a4ea9
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/VisualStates.ChildWindow.cs
@@ -0,0 +1,22 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static partial class VisualStates
+ {
+ ///
+ /// Window State group name.
+ ///
+ public const string WindowStatesGroup = "WindowStatesGroup";
+
+ ///
+ /// Open state name for ChildWindow.
+ ///
+ public const string Open = "Open";
+
+ ///
+ /// Closed state name for ChildWindow.
+ ///
+ public const string Closed = "Closed";
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/WindowState.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/WindowState.cs
new file mode 100644
index 00000000..cc001a25
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ChildWindow/WindowState.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Microsoft.Windows.Controls
+{
+ public enum WindowState
+ {
+ Closed,
+ Open
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorPicker.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorPicker.cs
new file mode 100644
index 00000000..03b31965
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorPicker.cs
@@ -0,0 +1,396 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Controls.Primitives;
+
+namespace Microsoft.Windows.Controls
+{
+ public class ColorPicker : Control
+ {
+ #region Private Members
+
+ ToggleButton _colorPickerToggleButton;
+ Popup _colorPickerCanvasPopup;
+ Button _okButton;
+ private TranslateTransform _colorShadeSelectorTransform = new TranslateTransform();
+ private Canvas _colorShadingCanvas;
+ private Canvas _colorShadeSelector;
+ private ColorSpectrumSlider _spectrumSlider;
+ private Point? _currentColorPosition;
+ private Color _currentColor = Colors.White;
+ private bool _isLoaded;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static ColorPicker()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorPicker), new FrameworkPropertyMetadata(typeof(ColorPicker)));
+ }
+
+ public ColorPicker()
+ {
+
+ }
+
+ #endregion //Constructors
+
+ #region Properties
+
+ public static readonly DependencyProperty CurrentColorProperty = DependencyProperty.Register("CurrentColor", typeof(Color), typeof(ColorPicker), new PropertyMetadata(Colors.White));
+ public Color CurrentColor
+ {
+ get { return (Color)GetValue(CurrentColorProperty); }
+ set { SetValue(CurrentColorProperty, value); }
+ }
+
+ #region SelectedColor
+
+ public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(ColorPicker), new FrameworkPropertyMetadata(Colors.White, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(SelectedColorPropertyChanged)));
+ public Color SelectedColor
+ {
+ get { return (Color)GetValue(SelectedColorProperty); }
+ set { SetValue(SelectedColorProperty, value); }
+ }
+
+ private static void SelectedColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ColorPicker colorPicker = (ColorPicker)d;
+ colorPicker.SetSelectedColor((Color)e.NewValue);
+ }
+
+ #endregion //SelectedColor
+
+ #region ScRGB
+
+ #region ScA
+
+ public static readonly DependencyProperty ScAProperty = DependencyProperty.Register("ScA", typeof(float), typeof(ColorPicker), new PropertyMetadata((float)1, new PropertyChangedCallback(OnScAPropertyChangedChanged)));
+ public float ScA
+ {
+ get { return (float)GetValue(ScAProperty); }
+ set { SetValue(ScAProperty, value); }
+ }
+
+ private static void OnScAPropertyChangedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ColorPicker c = (ColorPicker)d;
+ c.SetScA((float)e.NewValue);
+ }
+
+ protected virtual void SetScA(float newValue)
+ {
+ _currentColor.ScA = newValue;
+ A = _currentColor.A;
+ CurrentColor = _currentColor;
+ HexadecimalString = _currentColor.ToString();
+ }
+
+ #endregion //ScA
+
+ #region ScR
+
+ public static readonly DependencyProperty ScRProperty = DependencyProperty.Register("ScR", typeof(float), typeof(ColorPicker), new PropertyMetadata((float)1, new PropertyChangedCallback(OnScRPropertyChanged)));
+ public float ScR
+ {
+ get { return (float)GetValue(ScRProperty); }
+ set { SetValue(RProperty, value); }
+ }
+
+ private static void OnScRPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //ScR
+
+ #region ScG
+
+ public static readonly DependencyProperty ScGProperty = DependencyProperty.Register("ScG", typeof(float), typeof(ColorPicker), new PropertyMetadata((float)1, new PropertyChangedCallback(OnScGPropertyChanged)));
+ public float ScG
+ {
+ get { return (float)GetValue(ScGProperty); }
+ set { SetValue(GProperty, value); }
+ }
+
+ private static void OnScGPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //ScG
+
+ #region ScB
+
+ public static readonly DependencyProperty ScBProperty = DependencyProperty.Register("ScB", typeof(float), typeof(ColorPicker), new PropertyMetadata((float)1, new PropertyChangedCallback(OnScBPropertyChanged)));
+ public float ScB
+ {
+ get { return (float)GetValue(BProperty); }
+ set { SetValue(BProperty, value); }
+ }
+
+ private static void OnScBPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //ScB
+
+ #endregion //ScRGB
+
+ #region RGB
+
+ #region A
+
+ public static readonly DependencyProperty AProperty = DependencyProperty.Register("A", typeof(byte), typeof(ColorPicker), new PropertyMetadata((byte)255, new PropertyChangedCallback(OnAPropertyChanged)));
+ public byte A
+ {
+ get { return (byte)GetValue(AProperty); }
+ set { SetValue(AProperty, value); }
+ }
+
+ private static void OnAPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ColorPicker c = (ColorPicker)d;
+ c.SetA((byte)e.NewValue);
+ }
+
+ protected virtual void SetA(byte newValue)
+ {
+ _currentColor.A = newValue;
+ SetValue(CurrentColorProperty, _currentColor);
+ }
+
+ #endregion //A
+
+ #region R
+
+ public static readonly DependencyProperty RProperty = DependencyProperty.Register("R", typeof(byte), typeof(ColorPicker), new PropertyMetadata((byte)255, new PropertyChangedCallback(OnRPropertyChanged)));
+ public byte R
+ {
+ get { return (byte)GetValue(RProperty); }
+ set { SetValue(RProperty, value); }
+ }
+
+ private static void OnRPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //R
+
+ #region G
+
+ public static readonly DependencyProperty GProperty = DependencyProperty.Register("G", typeof(byte), typeof(ColorPicker), new PropertyMetadata((byte)255, new PropertyChangedCallback(OnGPropertyChanged)));
+ public byte G
+ {
+ get { return (byte)GetValue(GProperty); }
+ set { SetValue(GProperty, value); }
+ }
+
+ private static void OnGPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //G
+
+ #region B
+
+ public static readonly DependencyProperty BProperty = DependencyProperty.Register("B", typeof(byte), typeof(ColorPicker), new PropertyMetadata((byte)255, new PropertyChangedCallback(OnBPropertyChanged)));
+ public byte B
+ {
+ get { return (byte)GetValue(BProperty); }
+ set { SetValue(BProperty, value); }
+ }
+
+ private static void OnBPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //B
+
+ #endregion //RGB
+
+ #region HexadecimalString
+
+ public static readonly DependencyProperty HexadecimalStringProperty = DependencyProperty.Register("HexadecimalString", typeof(string), typeof(ColorPicker), new PropertyMetadata("#FFFFFFFF", new PropertyChangedCallback(OnHexadecimalStringPropertyChanged)));
+ public string HexadecimalString
+ {
+ get { return (string)GetValue(HexadecimalStringProperty); }
+ set { SetValue(HexadecimalStringProperty, value); }
+ }
+
+ private static void OnHexadecimalStringPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //HexadecimalString
+
+ #endregion //Properties
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ _colorPickerToggleButton = (ToggleButton)GetTemplateChild("PART_ColorPickerToggleButton");
+ _colorPickerToggleButton.Click += ColorPickerToggleButton_Clicked;
+
+ _colorPickerCanvasPopup = (Popup)GetTemplateChild("PART_ColorPickerCanvasPopup");
+
+ _colorShadingCanvas = (Canvas)GetTemplateChild("PART_ColorShadingCanvas");
+ _colorShadingCanvas.MouseLeftButtonDown += ColorShadingCanvas_MouseLeftButtonDown;
+ _colorShadingCanvas.MouseMove += ColorShadingCanvas_MouseMove;
+ _colorShadingCanvas.SizeChanged += ColorShadingCanvas_SizeChanged;
+
+ _colorShadeSelector = (Canvas)GetTemplateChild("PART_ColorShadeSelector");
+ _colorShadeSelector.RenderTransform = _colorShadeSelectorTransform;
+
+ _spectrumSlider = (ColorSpectrumSlider)GetTemplateChild("PART_SpectrumSlider");
+ _spectrumSlider.ValueChanged += SpectrumSlider_ValueChanged;
+
+ _okButton = (Button)GetTemplateChild("PART_OkButton");
+ _okButton.Click += OkButton_Click;
+
+ SetSelectedColor(SelectedColor);
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Event Handlers
+
+ void ColorShadingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ Point p = e.GetPosition(_colorShadingCanvas);
+ UpdateColorShadeSelectorPositionAndCalculateColor(p);
+ }
+
+ void ColorShadingCanvas_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.LeftButton == MouseButtonState.Pressed)
+ {
+ Point p = e.GetPosition(_colorShadingCanvas);
+ UpdateColorShadeSelectorPositionAndCalculateColor(p);
+ Mouse.Synchronize();
+ }
+ }
+
+ void ColorShadingCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
+ {
+ if (_currentColorPosition != null)
+ {
+ Point _newPoint = new Point
+ {
+ X = ((Point)_currentColorPosition).X * e.NewSize.Width,
+ Y = ((Point)_currentColorPosition).Y * e.NewSize.Height
+ };
+
+ UpdateColorShadeSelectorPositionAndCalculateColor(_newPoint, false);
+ }
+ }
+
+ void SpectrumSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
+ {
+ if (_currentColorPosition != null)
+ {
+ CalculateColor((Point)_currentColorPosition);
+ }
+ }
+
+ void OkButton_Click(object sender, RoutedEventArgs e)
+ {
+ if (_colorPickerCanvasPopup.IsOpen || _colorPickerToggleButton.IsChecked == true)
+ {
+ CloseColorPicker();
+ SelectedColor = CurrentColor;
+ }
+ }
+
+ void ColorPickerToggleButton_Clicked(object sender, RoutedEventArgs e)
+ {
+ _colorPickerCanvasPopup.IsOpen = _colorPickerToggleButton.IsChecked ?? false;
+ }
+
+ #endregion //Event Handlers
+
+ #region Methods
+
+ private void CloseColorPicker()
+ {
+ _colorPickerToggleButton.IsChecked = false;
+ _colorPickerCanvasPopup.IsOpen = false;
+ }
+
+ private void SetSelectedColor(Color theColor)
+ {
+ _currentColor = theColor;
+ SetValue(AProperty, _currentColor.A);
+ SetValue(RProperty, _currentColor.R);
+ SetValue(GProperty, _currentColor.G);
+ SetValue(BProperty, _currentColor.B);
+ UpdateColorShadeSelectorPosition(_currentColor);
+ }
+
+ private void UpdateColorShadeSelectorPositionAndCalculateColor(Point p, bool calculateColor = true)
+ {
+ if (p.Y < 0)
+ p.Y = 0;
+
+ if (p.X < 0)
+ p.X = 0;
+
+ if (p.X > _colorShadingCanvas.ActualWidth)
+ p.X = _colorShadingCanvas.ActualWidth;
+
+ if (p.Y > _colorShadingCanvas.ActualHeight)
+ p.Y = _colorShadingCanvas.ActualHeight;
+
+ _colorShadeSelectorTransform.X = p.X - (_colorShadeSelector.Width / 2);
+ _colorShadeSelectorTransform.Y = p.Y - (_colorShadeSelector.Height / 2);
+
+ p.X = p.X / _colorShadingCanvas.ActualWidth;
+ p.Y = p.Y / _colorShadingCanvas.ActualHeight;
+
+ _currentColorPosition = p;
+
+ if (calculateColor)
+ CalculateColor(p);
+ }
+
+ private void UpdateColorShadeSelectorPosition(Color color)
+ {
+ if (_spectrumSlider == null || _colorShadingCanvas == null)
+ return;
+
+ _currentColorPosition = null;
+
+ HsvColor hsv = ColorUtilities.ConvertRgbToHsv(color.R, color.G, color.B);
+ _spectrumSlider.Value = hsv.H;
+
+ Point p = new Point(hsv.S, 1 - hsv.V);
+
+ _currentColorPosition = p;
+
+ _colorShadeSelectorTransform.X = (p.X * _colorShadingCanvas.Width) - 5;
+ _colorShadeSelectorTransform.Y = (p.Y * _colorShadingCanvas.Height) - 5;
+ }
+
+ private void CalculateColor(Point p)
+ {
+ HsvColor hsv = new HsvColor(360 - _spectrumSlider.Value, 1, 1) { S = p.X, V = 1 - p.Y };
+ _currentColor = ColorUtilities.ConvertHsvToRgb(hsv.H, hsv.S, hsv.V); ;
+ _currentColor.ScA = ScA;
+ CurrentColor = _currentColor;
+ HexadecimalString = _currentColor.ToString();
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorSpectrumSlider.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorSpectrumSlider.cs
new file mode 100644
index 00000000..c4eac2d8
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorSpectrumSlider.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Shapes;
+
+namespace Microsoft.Windows.Controls
+{
+ internal class ColorSpectrumSlider : Slider
+ {
+ #region Private Members
+
+ private Rectangle _spectrumDisplay;
+ private LinearGradientBrush _pickerBrush;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static ColorSpectrumSlider()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorSpectrumSlider), new FrameworkPropertyMetadata(typeof(ColorSpectrumSlider)));
+ }
+
+ #endregion //Constructors
+
+ #region Dependency Properties
+
+ public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(ColorSpectrumSlider), new PropertyMetadata(System.Windows.Media.Colors.Transparent));
+ public Color SelectedColor
+ {
+ get { return (Color)GetValue(SelectedColorProperty); }
+ set { SetValue(SelectedColorProperty, value); }
+ }
+
+ #endregion //Dependency Properties
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ _spectrumDisplay = (Rectangle)GetTemplateChild("PART_SpectrumDisplay");
+ CreateSpectrum();
+ OnValueChanged(Double.NaN, Value);
+ }
+
+ protected override void OnValueChanged(double oldValue, double newValue)
+ {
+ base.OnValueChanged(oldValue, newValue);
+
+ Color color = ColorUtilities.ConvertHsvToRgb(360 - newValue, 1, 1);
+ SelectedColor = color;
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Methods
+
+ private void CreateSpectrum()
+ {
+ _pickerBrush = new LinearGradientBrush();
+ _pickerBrush.StartPoint = new Point(0.5, 0);
+ _pickerBrush.EndPoint = new Point(0.5, 1);
+ _pickerBrush.ColorInterpolationMode = ColorInterpolationMode.SRgbLinearInterpolation;
+
+ List colorsList = ColorUtilities.GenerateHsvSpectrum();
+
+ double stopIncrement = (double)1 / colorsList.Count;
+
+ int i;
+ for (i = 0; i < colorsList.Count; i++)
+ {
+ _pickerBrush.GradientStops.Add(new GradientStop(colorsList[i], i * stopIncrement));
+ }
+
+ _pickerBrush.GradientStops[i - 1].Offset = 1.0;
+ _spectrumDisplay.Fill = _pickerBrush;
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorUtilities.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorUtilities.cs
new file mode 100644
index 00000000..e621c22b
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/ColorUtilities.cs
@@ -0,0 +1,156 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Media;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static class ColorUtilities
+ {
+ ///
+ /// Converts an RGB color to an HSV color.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static HsvColor ConvertRgbToHsv(int r, int b, int g)
+ {
+ double delta, min;
+ double h = 0, s, v;
+
+ min = Math.Min(Math.Min(r, g), b);
+ v = Math.Max(Math.Max(r, g), b);
+ delta = v - min;
+
+ if (v == 0.0)
+ {
+ s = 0;
+ }
+ else
+ s = delta / v;
+
+ if (s == 0)
+ h = 0.0;
+
+ else
+ {
+ if (r == v)
+ h = (g - b) / delta;
+ else if (g == v)
+ h = 2 + (b - r) / delta;
+ else if (b == v)
+ h = 4 + (r - g) / delta;
+
+ h *= 60;
+ if (h < 0.0)
+ h = h + 360;
+
+ }
+
+ return new HsvColor { H = h, S = s, V = v / 255 };
+ }
+
+ ///
+ /// Converts an HSV color to an RGB color.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static Color ConvertHsvToRgb(double h, double s, double v)
+ {
+ double r = 0, g = 0, b = 0;
+
+ if (s == 0)
+ {
+ r = v;
+ g = v;
+ b = v;
+ }
+ else
+ {
+ int i;
+ double f, p, q, t;
+
+ if (h == 360)
+ h = 0;
+ else
+ h = h / 60;
+
+ i = (int)Math.Truncate(h);
+ f = h - i;
+
+ p = v * (1.0 - s);
+ q = v * (1.0 - (s * f));
+ t = v * (1.0 - (s * (1.0 - f)));
+
+ switch (i)
+ {
+ case 0:
+ {
+ r = v;
+ g = t;
+ b = p;
+ break;
+ }
+ case 1:
+ {
+ r = q;
+ g = v;
+ b = p;
+ break;
+ }
+ case 2:
+ {
+ r = p;
+ g = v;
+ b = t;
+ break;
+ }
+ case 3:
+ {
+ r = p;
+ g = q;
+ b = v;
+ break;
+ }
+ case 4:
+ {
+ r = t;
+ g = p;
+ b = v;
+ break;
+ }
+ default:
+ {
+ r = v;
+ g = p;
+ b = q;
+ break;
+ }
+ }
+
+ }
+
+ return Color.FromArgb(255, (byte)(r * 255), (byte)(g * 255), (byte)(b * 255));
+ }
+
+ ///
+ /// Generates a list of colors with hues ranging from 0 360 and a saturation and value of 1.
+ ///
+ ///
+ public static List GenerateHsvSpectrum()
+ {
+ List colorsList = new List(8);
+
+ for (int i = 0; i < 29; i++)
+ {
+ colorsList.Add(ColorUtilities.ConvertHsvToRgb(i * 12, 1, 1));
+ }
+
+ colorsList.Add(ColorUtilities.ConvertHsvToRgb(0, 1, 1));
+
+ return colorsList;
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/HsvColor.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/HsvColor.cs
new file mode 100644
index 00000000..eed5c3bd
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/ColorPicker/HsvColor.cs
@@ -0,0 +1,18 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal struct HsvColor
+ {
+ public double H;
+ public double S;
+ public double V;
+
+ public HsvColor(double h, double s, double v)
+ {
+ H = h;
+ S = s;
+ V = v;
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs
new file mode 100644
index 00000000..263ca034
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs
@@ -0,0 +1,215 @@
+using System;
+using System.Collections;
+using System.Windows.Media;
+using System.Windows.Documents;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls.Core
+{
+ ///
+ /// An adorner that can display one and only one UIElement.
+ /// That element can be a panel, which contains multiple other elements.
+ /// The element is added to the adorner's visual and logical trees, enabling it to
+ /// particpate in dependency property value inheritance, amongst other things.
+ ///
+ internal class UIElementAdorner
+ : Adorner
+ where TElement : UIElement
+ {
+ #region Fields
+
+ TElement _child = null;
+ double _offsetLeft = 0;
+ double _offsetTop = 0;
+
+ #endregion // Fields
+
+ #region Constructor
+
+ ///
+ /// Constructor.
+ ///
+ /// The element to which the adorner will be bound.
+ public UIElementAdorner(UIElement adornedElement)
+ : base(adornedElement)
+ {
+ }
+
+ #endregion // Constructor
+
+ #region Public Interface
+
+ #region Child
+
+ ///
+ /// Gets/sets the child element hosted in the adorner.
+ ///
+ public TElement Child
+ {
+ get { return _child; }
+ set
+ {
+ if (value == _child)
+ return;
+
+ if (_child != null)
+ {
+ base.RemoveLogicalChild(_child);
+ base.RemoveVisualChild(_child);
+ }
+
+ _child = value;
+
+ if (_child != null)
+ {
+ base.AddLogicalChild(_child);
+ base.AddVisualChild(_child);
+ }
+ }
+ }
+
+ #endregion // Child
+
+ #region GetDesiredTransform
+
+ ///
+ /// Override.
+ ///
+ ///
+ ///
+ public override GeneralTransform GetDesiredTransform(GeneralTransform transform)
+ {
+ GeneralTransformGroup result = new GeneralTransformGroup();
+ result.Children.Add(base.GetDesiredTransform(transform));
+ result.Children.Add(new TranslateTransform(_offsetLeft, _offsetTop));
+ return result;
+ }
+
+ #endregion // GetDesiredTransform
+
+ #region OffsetLeft
+
+ ///
+ /// Gets/sets the horizontal offset of the adorner.
+ ///
+ public double OffsetLeft
+ {
+ get { return _offsetLeft; }
+ set
+ {
+ _offsetLeft = value;
+ UpdateLocation();
+ }
+ }
+
+ #endregion // OffsetLeft
+
+ #region SetOffsets
+
+ ///
+ /// Updates the location of the adorner in one atomic operation.
+ ///
+ public void SetOffsets(double left, double top)
+ {
+ _offsetLeft = left;
+ _offsetTop = top;
+ this.UpdateLocation();
+ }
+
+ #endregion // SetOffsets
+
+ #region OffsetTop
+
+ ///
+ /// Gets/sets the vertical offset of the adorner.
+ ///
+ public double OffsetTop
+ {
+ get { return _offsetTop; }
+ set
+ {
+ _offsetTop = value;
+ UpdateLocation();
+ }
+ }
+
+ #endregion // OffsetTop
+
+ #endregion // Public Interface
+
+ #region Protected Overrides
+
+ ///
+ /// Override.
+ ///
+ ///
+ ///
+ protected override Size MeasureOverride(Size constraint)
+ {
+ if (_child == null)
+ return base.MeasureOverride(constraint);
+
+ _child.Measure(constraint);
+ return _child.DesiredSize;
+ }
+
+ ///
+ /// Override.
+ ///
+ ///
+ ///
+ protected override Size ArrangeOverride(Size finalSize)
+ {
+ if (_child == null)
+ return base.ArrangeOverride(finalSize);
+
+ _child.Arrange(new Rect(finalSize));
+ return finalSize;
+ }
+
+ ///
+ /// Override.
+ ///
+ protected override IEnumerator LogicalChildren
+ {
+ get
+ {
+ ArrayList list = new ArrayList();
+ if (_child != null)
+ list.Add(_child);
+ return list.GetEnumerator();
+ }
+ }
+
+ ///
+ /// Override.
+ ///
+ ///
+ ///
+ protected override Visual GetVisualChild(int index)
+ {
+ return _child;
+ }
+
+ ///
+ /// Override.
+ ///
+ protected override int VisualChildrenCount
+ {
+ get { return _child == null ? 0 : 1; }
+ }
+
+ #endregion // Protected Overrides
+
+ #region Private Helpers
+
+ void UpdateLocation()
+ {
+ AdornerLayer adornerLayer = base.Parent as AdornerLayer;
+ if (adornerLayer != null)
+ adornerLayer.Update(base.AdornedElement);
+ }
+
+ #endregion // Private Helpers
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Error48.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Error48.png
new file mode 100644
index 00000000..4304d43b
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Error48.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Information48.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Information48.png
new file mode 100644
index 00000000..35075187
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Information48.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Question48.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Question48.png
new file mode 100644
index 00000000..dad7dd09
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Question48.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Warning48.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Warning48.png
new file mode 100644
index 00000000..ecb7fe86
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/Icons/Warning48.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/MessageBox.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/MessageBox.cs
new file mode 100644
index 00000000..317dd405
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/MessageBox.cs
@@ -0,0 +1,419 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Controls.Primitives;
+
+namespace Microsoft.Windows.Controls
+{
+ [TemplateVisualState(Name = VisualStates.OK, GroupName = VisualStates.MessageBoxButtonsGroup)]
+ [TemplateVisualState(Name = VisualStates.OKCancel, GroupName = VisualStates.MessageBoxButtonsGroup)]
+ [TemplateVisualState(Name = VisualStates.YesNo, GroupName = VisualStates.MessageBoxButtonsGroup)]
+ [TemplateVisualState(Name = VisualStates.YesNoCancel, GroupName = VisualStates.MessageBoxButtonsGroup)]
+ public class MessageBox : Control
+ {
+ #region Private Members
+
+ ///
+ /// Tracks the MessageBoxButon value passed into the InitializeContainer method
+ ///
+ private MessageBoxButton _button = MessageBoxButton.OK;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static MessageBox()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(MessageBox), new FrameworkPropertyMetadata(typeof(MessageBox)));
+ }
+
+ internal MessageBox()
+ { /*user cannot create instance */ }
+
+ #endregion //Constructors
+
+ #region Properties
+
+ #region Protected Properties
+
+ ///
+ /// A System.Windows.MessageBoxResult value that specifies which message box button was clicked by the user.
+ ///
+ protected MessageBoxResult MessageBoxResult = MessageBoxResult.None;
+
+ protected Window Container { get; private set; }
+ protected Thumb DragWidget { get; private set; }
+ protected Button CloseButton { get; private set; }
+
+ protected Button OkButton { get; private set; }
+ protected Button CancelButton { get; private set; }
+ protected Button YesButton { get; private set; }
+ protected Button NoButton { get; private set; }
+
+ protected Button OkButton1 { get; private set; }
+ protected Button CancelButton1 { get; private set; }
+ protected Button YesButton1 { get; private set; }
+ protected Button NoButton1 { get; private set; }
+
+ #endregion //Protected Properties
+
+ #region Dependency Properties
+
+ public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(MessageBox), new UIPropertyMetadata(String.Empty));
+ public string Caption
+ {
+ get { return (string)GetValue(CaptionProperty); }
+ set { SetValue(CaptionProperty, value); }
+ }
+
+ public static readonly DependencyProperty CaptionForegroundProperty = DependencyProperty.Register("CaptionForeground", typeof(Brush), typeof(MessageBox), new UIPropertyMetadata(null));
+ public Brush CaptionForeground
+ {
+ get { return (Brush)GetValue(CaptionForegroundProperty); }
+ set { SetValue(CaptionForegroundProperty, value); }
+ }
+
+ public static readonly DependencyProperty CloseButtonStyleProperty = DependencyProperty.Register("CloseButtonStyle", typeof(Style), typeof(MessageBox), new PropertyMetadata(null));
+ public Style CloseButtonStyle
+ {
+ get { return (Style)GetValue(CloseButtonStyleProperty); }
+ set { SetValue(CloseButtonStyleProperty, value); }
+ }
+
+ public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(MessageBox), new UIPropertyMetadata(default(ImageSource)));
+ public ImageSource ImageSource
+ {
+ get { return (ImageSource)GetValue(ImageSourceProperty); }
+ set { SetValue(ImageSourceProperty, value); }
+ }
+
+ public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MessageBox), new UIPropertyMetadata(String.Empty));
+ public string Text
+ {
+ get { return (string)GetValue(TextProperty); }
+ set { SetValue(TextProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowBackgroundProperty = DependencyProperty.Register("WindowBackground", typeof(Brush), typeof(MessageBox), new PropertyMetadata(null));
+ public Brush WindowBackground
+ {
+ get { return (Brush)GetValue(WindowBackgroundProperty); }
+ set { SetValue(WindowBackgroundProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowBorderBrushProperty = DependencyProperty.Register("WindowBorderBrush", typeof(Brush), typeof(MessageBox), new PropertyMetadata(null));
+ public Brush WindowBorderBrush
+ {
+ get { return (Brush)GetValue(WindowBorderBrushProperty); }
+ set { SetValue(WindowBorderBrushProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowOpacityProperty = DependencyProperty.Register("WindowOpacity", typeof(double), typeof(MessageBox), new PropertyMetadata(null));
+ public double WindowOpacity
+ {
+ get { return (double)GetValue(WindowOpacityProperty); }
+ set { SetValue(WindowOpacityProperty, value); }
+ }
+
+ #endregion //Dependency Properties
+
+ #endregion //Properties
+
+ #region Base Class Overrides
+
+ ///
+ /// Overrides the OnApplyTemplate method.
+ ///
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ DragWidget = (Thumb)GetTemplateChild("PART_DragWidget");
+ if (DragWidget != null)
+ DragWidget.DragDelta += (o, e) => ProcessMove(e);
+
+ CloseButton = (Button)GetTemplateChild("PART_CloseButton");
+ if (CloseButton != null)
+ CloseButton.Click += (o, e) => Close();
+
+ NoButton = (Button)GetTemplateChild("PART_NoButton");
+ if (NoButton != null)
+ NoButton.Click += (o, e) => Button_Click(o, e);
+
+ NoButton1 = (Button)GetTemplateChild("PART_NoButton1");
+ if (NoButton1 != null)
+ NoButton1.Click += (o, e) => Button_Click(o, e);
+
+ YesButton = (Button)GetTemplateChild("PART_YesButton");
+ if (YesButton != null)
+ YesButton.Click += (o, e) => Button_Click(o, e);
+
+ YesButton1 = (Button)GetTemplateChild("PART_YesButton1");
+ if (YesButton1 != null)
+ YesButton1.Click += (o, e) => Button_Click(o, e);
+
+ CancelButton = (Button)GetTemplateChild("PART_CancelButton");
+ if (CancelButton != null)
+ CancelButton.Click += (o, e) => Button_Click(o, e);
+
+ CancelButton1 = (Button)GetTemplateChild("PART_CancelButton1");
+ if (CancelButton1 != null)
+ CancelButton1.Click += (o, e) => Button_Click(o, e);
+
+ OkButton = (Button)GetTemplateChild("PART_OkButton");
+ if (OkButton != null)
+ OkButton.Click += (o, e) => Button_Click(o, e);
+
+ OkButton1 = (Button)GetTemplateChild("PART_OkButton1");
+ if (OkButton1 != null)
+ OkButton1.Click += (o, e) => Button_Click(o, e);
+
+ ChangeVisualState(_button.ToString(), true);
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Methods
+
+ #region Public Static
+
+ ///
+ /// Displays a message box that has a message and that returns a result.
+ ///
+ /// A System.String that specifies the text to display.
+ /// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
+ public static MessageBoxResult Show(string messageText)
+ {
+ return Show(messageText, string.Empty, MessageBoxButton.OK);
+ }
+
+ ///
+ /// Displays a message box that has a message and title bar caption; and that returns a result.
+ ///
+ /// A System.String that specifies the text to display.
+ /// A System.String that specifies the title bar caption to display.
+ /// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
+ public static MessageBoxResult Show(string messageText, string caption)
+ {
+ return Show(messageText, caption, MessageBoxButton.OK);
+ }
+
+ ///
+ /// Displays a message box that has a message and that returns a result.
+ ///
+ /// A System.String that specifies the text to display.
+ /// A System.String that specifies the title bar caption to display.
+ /// A System.Windows.MessageBoxButton value that specifies which button or buttons to display.
+ /// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
+ public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button)
+ {
+ return ShowCore(messageText, caption, button, MessageBoxImage.None);
+ }
+
+ ///
+ /// Displays a message box that has a message and that returns a result.
+ ///
+ /// A System.String that specifies the text to display.
+ /// A System.String that specifies the title bar caption to display.
+ /// A System.Windows.MessageBoxButton value that specifies which button or buttons to display.
+ /// A System.Windows.MessageBoxImage value that specifies the icon to display.
+ /// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
+ public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon)
+ {
+ return ShowCore(messageText, caption, button, icon);
+ }
+
+ #endregion //Public Static
+
+ #region Private Static
+
+ private static MessageBoxResult ShowCore(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon)
+ {
+ MessageBox msgBox = new MessageBox();
+ msgBox.InitializeMessageBox(messageText, caption, button, icon);
+ msgBox.Show();
+ return msgBox.MessageBoxResult;
+ }
+
+ ///
+ /// Resolves the owner Window of the MessageBox.
+ ///
+ ///
+ private static FrameworkElement ResolveOwner()
+ {
+ FrameworkElement owner = null;
+ if (Application.Current != null)
+ {
+ foreach (Window w in Application.Current.Windows)
+ {
+ if (w.IsActive)
+ {
+ owner = w;
+ break;
+ }
+ }
+ }
+ return owner;
+ }
+
+ #endregion //Private Static
+
+ #region Protected
+
+ ///
+ /// Shows the MessageBox
+ ///
+ protected void Show()
+ {
+ Container.ShowDialog();
+ }
+
+ ///
+ /// Initializes the MessageBox.
+ ///
+ /// The text.
+ /// The caption.
+ /// The button.
+ /// The image.
+ protected void InitializeMessageBox(string text, string caption, MessageBoxButton button, MessageBoxImage image)
+ {
+ Text = text;
+ Caption = caption;
+ _button = button;
+ SetImageSource(image);
+ Container = CreateContainer();
+ }
+
+ ///
+ /// Changes the control's visual state(s).
+ ///
+ /// name of the state
+ /// True if state transitions should be used.
+ protected void ChangeVisualState(string name, bool useTransitions)
+ {
+ VisualStateManager.GoToState(this, name, useTransitions);
+ }
+
+ #endregion //Protected
+
+ #region Private
+
+ ///
+ /// Sets the message image source.
+ ///
+ /// The image to show.
+ private void SetImageSource(MessageBoxImage image)
+ {
+ String iconName = String.Empty;
+
+ switch (image)
+ {
+ case MessageBoxImage.Error:
+ {
+ iconName = "Error48.png";
+ break;
+ }
+ case MessageBoxImage.Information:
+ {
+ iconName = "Information48.png";
+ break;
+ }
+ case MessageBoxImage.Question:
+ {
+ iconName = "Question48.png";
+ break;
+ }
+ case MessageBoxImage.Warning:
+ {
+ iconName = "Warning48.png";
+ break;
+ }
+ case MessageBoxImage.None:
+ default:
+ {
+ return;
+ }
+ }
+
+ ImageSource = (ImageSource)new ImageSourceConverter().ConvertFromString(String.Format("pack://application:,,,/WPFToolkit.Extended;component/MessageBox/Icons/{0}", iconName));
+ }
+
+ ///
+ /// Creates the container which will host the MessageBox control.
+ ///
+ ///
+ private Window CreateContainer()
+ {
+ return new Window()
+ {
+ AllowsTransparency = true,
+ Background = Brushes.Transparent,
+ Content = this,
+ Owner = Window.GetWindow(ResolveOwner()),
+ ShowInTaskbar = false,
+ SizeToContent = System.Windows.SizeToContent.WidthAndHeight,
+ ResizeMode = System.Windows.ResizeMode.NoResize,
+ WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner,
+ WindowStyle = System.Windows.WindowStyle.None
+ };
+ }
+
+ #endregion //Private
+
+ #endregion //Methods
+
+ #region Event Handlers
+
+ ///
+ /// Processes the move of a drag operation on the header.
+ ///
+ /// The instance containing the event data.
+ private void ProcessMove(DragDeltaEventArgs e)
+ {
+ Container.Left = Container.Left + e.HorizontalChange;
+ Container.Top = Container.Top + e.VerticalChange;
+ }
+
+ ///
+ /// Sets the MessageBoxResult according to the button pressed and then closes the MessageBox.
+ ///
+ /// The source of the event.
+ /// The instance containing the event data.
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ Button button = e.Source as Button;
+ switch (button.Name)
+ {
+ case "PART_NoButton":
+ case "PART_NoButton1":
+ MessageBoxResult = MessageBoxResult.No;
+ break;
+ case "PART_YesButton":
+ case "PART_YesButton1":
+ MessageBoxResult = MessageBoxResult.Yes;
+ break;
+ case "PART_CancelButton":
+ case "PART_CancelButton1":
+ MessageBoxResult = MessageBoxResult.Cancel;
+ break;
+ case "PART_OkButton":
+ case "PART_OkButton1":
+ MessageBoxResult = MessageBoxResult.OK;
+ break;
+ }
+
+ Close();
+ }
+
+ ///
+ /// Closes the MessageBox.
+ ///
+ private void Close()
+ {
+ Container.Close();
+ }
+
+ #endregion //Event Handlers
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/VisualStates.MessageBox.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/VisualStates.MessageBox.cs
new file mode 100644
index 00000000..d47fcb08
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MessageBox/VisualStates.MessageBox.cs
@@ -0,0 +1,17 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static partial class VisualStates
+ {
+ public const string MessageBoxButtonsGroup = "MessageBoxButtonsGroup";
+
+ public const string OK = "OK";
+
+ public const string OKCancel = "OKCancel";
+
+ public const string YesNo = "YesNo";
+
+ public const string YesNoCancel = "YesNoCancel";
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/NumericUpDown.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/NumericUpDown.cs
new file mode 100644
index 00000000..4ae1e983
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/NumericUpDown.cs
@@ -0,0 +1,185 @@
+using System;
+using System.Windows;
+using System.Globalization;
+
+namespace Microsoft.Windows.Controls
+{
+ public class NumericUpDown : UpDownBase
+ {
+ #region Properties
+
+ #region Minimum
+
+ public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(Double.MinValue, OnMinimumPropertyChanged));
+ public double Minimum
+ {
+ get { return (double)GetValue(MinimumProperty); }
+ set { SetValue(MinimumProperty, value); }
+ }
+
+ private static void OnMinimumPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ }
+
+ protected virtual void OnMinimumChanged(double oldValue, double newValue)
+ {
+ }
+ #endregion Minimum
+
+ #region Maximum
+
+ public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(Double.MaxValue, OnMaximumPropertyChanged));
+ public double Maximum
+ {
+ get { return (double)GetValue(MaximumProperty); }
+ set { SetValue(MaximumProperty, value); }
+ }
+
+ private static void OnMaximumPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ }
+
+ protected virtual void OnMaximumChanged(double oldValue, double newValue)
+ {
+ }
+ #endregion Maximum
+
+ #region Increment
+
+ public static readonly DependencyProperty IncrementProperty = DependencyProperty.Register("Increment", typeof(double), typeof(NumericUpDown), new PropertyMetadata(1d, OnIncrementPropertyChanged));
+ public double Increment
+ {
+ get { return (double)GetValue(IncrementProperty); }
+ set { SetValue(IncrementProperty, value); }
+ }
+
+ private static void OnIncrementPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ }
+
+ protected virtual void OnIncrementChanged(double oldValue, double newValue)
+ {
+ }
+
+ #endregion
+
+ #region FormatString
+
+ public static readonly DependencyProperty StringFormatProperty = DependencyProperty.Register("FormatString", typeof(string), typeof(NumericUpDown), new PropertyMetadata("F0", OnStringFormatPropertyPropertyChanged));
+ public string FormatString
+ {
+ get { return (string)GetValue(StringFormatProperty); }
+ set { SetValue(StringFormatProperty, value); }
+ }
+
+ private static void OnStringFormatPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ NumericUpDown nud = d as NumericUpDown;
+ nud.OnStringFormatChanged(e.OldValue.ToString(), e.NewValue.ToString());
+ }
+
+ protected virtual void OnStringFormatChanged(string oldValue, string newValue)
+ {
+ Text = FormatValue();
+ }
+
+ #endregion //FormatString
+
+ #endregion
+
+ #region Constructors
+
+ static NumericUpDown()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), new FrameworkPropertyMetadata(typeof(NumericUpDown)));
+ }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+ SetValidSpinDirection();
+ }
+
+ protected override void OnValueChanged(RoutedPropertyChangedEventArgs e)
+ {
+ SetValidSpinDirection();
+ }
+
+ protected override double ParseValue(string text)
+ {
+ NumberFormatInfo info = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture);
+ if (text.Contains(info.PercentSymbol))
+ return TryParcePercent(text, info);
+ else
+ return TryParceDouble(text, info);
+ }
+
+ protected internal override string FormatValue()
+ {
+ return Value.ToString(FormatString, CultureInfo.CurrentCulture);
+ }
+
+ protected override void OnIncrement()
+ {
+ Value = (double)((decimal)Value + (decimal)Increment);
+ }
+
+ protected override void OnDecrement()
+ {
+ Value = (double)((decimal)Value - (decimal)Increment);
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Methods
+
+ ///
+ /// Sets the valid spin direction based on current value, minimum and maximum.
+ ///
+ private void SetValidSpinDirection()
+ {
+ ValidSpinDirections validDirections = ValidSpinDirections.None;
+
+ if (Value < Maximum)
+ {
+ validDirections = validDirections | ValidSpinDirections.Increase;
+ }
+
+ if (Value > Minimum)
+ {
+ validDirections = validDirections | ValidSpinDirections.Decrease;
+ }
+
+ if (Spinner != null)
+ {
+ Spinner.ValidSpinDirection = validDirections;
+ }
+ }
+
+ private double TryParcePercent(string text, NumberFormatInfo info)
+ {
+ double result;
+ text = text.Replace(info.PercentSymbol, null);
+ result = TryParceDouble(text, info);
+ return result / 100;
+ }
+
+ private double TryParceDouble(string text, NumberFormatInfo info)
+ {
+ double result;
+ if (!double.TryParse(text, NumberStyles.Any, info, out result))
+ {
+ //an error occured now lets reset our value, text, and the text in the textbox
+ result = Value;
+ TextBox.Text = Text = FormatValue();
+ }
+ return result;
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/AssemblyInfo.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..3ce0496e
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/AssemblyInfo.cs
@@ -0,0 +1,59 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+using System.Windows.Markup;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Extended WPF Toolkit")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Extended WPF Toolkit")]
+[assembly: AssemblyCopyright("Copyright © 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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.2.0.0")]
+[assembly: AssemblyFileVersion("1.2.0.0")]
+
+[assembly: XmlnsPrefix("http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended", "extToolkit")]
+[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended", "Microsoft.Windows.Controls")]
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Resources.Designer.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..eaf63633
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Microsoft.Windows.Controls.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Windows.Controls.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Resources.resx b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Resources.resx
new file mode 100644
index 00000000..ffecec85
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Settings.Designer.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..4a0f1423
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Microsoft.Windows.Controls.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Settings.settings b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Settings.settings
new file mode 100644
index 00000000..8f2fd95d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/ITextFormatter.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/ITextFormatter.cs
new file mode 100644
index 00000000..f8e22d41
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/ITextFormatter.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Windows.Documents;
+
+namespace Microsoft.Windows.Controls
+{
+ public interface ITextFormatter
+ {
+ string GetText(FlowDocument document);
+ void SetText(FlowDocument document, string text);
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/PlainTextFormatter.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/PlainTextFormatter.cs
new file mode 100644
index 00000000..1c792a32
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/PlainTextFormatter.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Windows.Documents;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Formats the RichTextBox text as plain text
+ ///
+ public class PlainTextFormatter : ITextFormatter
+ {
+ public string GetText(FlowDocument document)
+ {
+ return new TextRange(document.ContentStart, document.ContentEnd).Text;
+ }
+
+ public void SetText(FlowDocument document, string text)
+ {
+ new TextRange(document.ContentStart, document.ContentEnd).Text = text;
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/RtfFormatter.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/RtfFormatter.cs
new file mode 100644
index 00000000..e5a1def6
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/RtfFormatter.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Text;
+using System.Windows.Documents;
+using System.IO;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Formats the RichTextBox text as RTF
+ ///
+ public class RtfFormatter : ITextFormatter
+ {
+ public string GetText(FlowDocument document)
+ {
+ TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
+ using (MemoryStream ms = new MemoryStream())
+ {
+ tr.Save(ms, DataFormats.Rtf);
+ return ASCIIEncoding.Default.GetString(ms.ToArray());
+ }
+ }
+
+ public void SetText(FlowDocument document, string text)
+ {
+ TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
+ using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(text)))
+ {
+ tr.Load(ms, DataFormats.Rtf);
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/XamlFormatter.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/XamlFormatter.cs
new file mode 100644
index 00000000..07e1d31a
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/Formatters/XamlFormatter.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Text;
+using System.IO;
+using System.Windows.Documents;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Formats the RichTextBox text as Xaml
+ ///
+ public class XamlFormatter : ITextFormatter
+ {
+ public string GetText(System.Windows.Documents.FlowDocument document)
+ {
+ TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
+ using (MemoryStream ms = new MemoryStream())
+ {
+ tr.Save(ms, DataFormats.Xaml);
+ return ASCIIEncoding.Default.GetString(ms.ToArray());
+ }
+ }
+
+ public void SetText(System.Windows.Documents.FlowDocument document, string text)
+ {
+ try
+ {
+ TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
+ using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(text)))
+ {
+ tr.Load(ms, DataFormats.Xaml);
+ }
+ }
+ catch
+ {
+ throw new InvalidDataException("data provided is not in the correct Xaml format.");
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs
new file mode 100644
index 00000000..c8015e32
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs
@@ -0,0 +1,135 @@
+using System;
+using System.Windows;
+using System.Windows.Data;
+using System.Windows.Threading;
+
+namespace Microsoft.Windows.Controls
+{
+ public class RichTextBox : System.Windows.Controls.RichTextBox
+ {
+ #region Private Members
+
+ private bool _textHasLoaded;
+ private bool isInvokePending;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ public RichTextBox()
+ {
+ Loaded += RichTextBox_Loaded;
+ }
+
+ public RichTextBox(System.Windows.Documents.FlowDocument document)
+ : base(document)
+ {
+
+ }
+
+ #endregion //Constructors
+
+ #region Properties
+
+ #region Text
+
+ public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(RichTextBox), new FrameworkPropertyMetadata(String.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextPropertyChanged, CoerceTextProperty, true, UpdateSourceTrigger.LostFocus));
+ public string Text
+ {
+ get { return (string)GetValue(TextProperty); }
+ set { SetValue(TextProperty, value); }
+ }
+
+ private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ RichTextBox rtb = (RichTextBox)d;
+
+ if (!rtb._textHasLoaded)
+ {
+ rtb.TextFormatter.SetText(rtb.Document, (string)e.NewValue);
+ rtb._textHasLoaded = true;
+ }
+ }
+
+ private static object CoerceTextProperty(DependencyObject d, object value)
+ {
+ return value ?? "";
+ }
+
+ #endregion //Text
+
+ #region TextFormatter
+
+ private ITextFormatter _textFormatter;
+ ///
+ /// The ITextFormatter the is used to format the text of the RichTextBox.
+ /// Deafult formatter is the RtfFormatter
+ ///
+ public ITextFormatter TextFormatter
+ {
+ get
+ {
+ if (_textFormatter == null)
+ _textFormatter = new RtfFormatter(); //default is rtf
+
+ return _textFormatter;
+ }
+ set
+ {
+ _textFormatter = value;
+ }
+ }
+
+ #endregion //TextFormatter
+
+ #endregion //Properties
+
+ #region Methods
+
+ private void InvokeUpdateText()
+ {
+ if (!isInvokePending)
+ {
+ Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(UpdateText));
+ isInvokePending = true;
+ }
+ }
+
+ private void UpdateText()
+ {
+ //when the Text is null and the Text hasn't been loaded, it indicates that the OnTextPropertyChanged event hasn't exceuted
+ //and since we are initializing the text from here, we don't want the OnTextPropertyChanged to execute, so set the loaded flag to true.
+ //this prevents the cursor to jumping to the front of the textbox after the first letter is typed.
+ if (!_textHasLoaded && string.IsNullOrEmpty(Text))
+ _textHasLoaded = true;
+
+ if (_textHasLoaded)
+ Text = TextFormatter.GetText(Document);
+
+ isInvokePending = false;
+ }
+
+ #endregion //Methods
+
+ #region Event Hanlders
+
+ private void RichTextBox_Loaded(object sender, RoutedEventArgs e)
+ {
+ Binding binding = BindingOperations.GetBinding(this, TextProperty);
+
+ if (binding != null)
+ {
+ if (binding.UpdateSourceTrigger == UpdateSourceTrigger.Default || binding.UpdateSourceTrigger == UpdateSourceTrigger.LostFocus)
+ {
+ PreviewLostKeyboardFocus += (o, ea) => UpdateText(); //do this synchronously
+ }
+ else
+ {
+ TextChanged += (o, ea) => InvokeUpdateText(); //do this async
+ }
+ }
+ }
+
+ #endregion //Event Hanlders
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs
new file mode 100644
index 00000000..46c38afe
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ public interface IRichTextBoxFormatBar
+ {
+ ///
+ /// Represents the RichTextBox that will be the target for all text manipulations in the format bar.
+ ///
+ global::System.Windows.Controls.RichTextBox Target { get; set; }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Bold16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Bold16.png
new file mode 100644
index 00000000..8fb36a1a
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Bold16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/CenterAlign16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/CenterAlign16.png
new file mode 100644
index 00000000..1030a021
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/CenterAlign16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Italic16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Italic16.png
new file mode 100644
index 00000000..8259a9e1
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Italic16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/JustifyAlign16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/JustifyAlign16.png
new file mode 100644
index 00000000..c5499bce
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/JustifyAlign16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/LeftAlign16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/LeftAlign16.png
new file mode 100644
index 00000000..51dffb73
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/LeftAlign16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/RightAlign16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/RightAlign16.png
new file mode 100644
index 00000000..cb8e400a
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/RightAlign16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Underline16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Underline16.png
new file mode 100644
index 00000000..72689482
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Underline16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml
new file mode 100644
index 00000000..6d919c41
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml.cs
new file mode 100644
index 00000000..65e78914
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml.cs
@@ -0,0 +1,162 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Media;
+using System.Windows.Controls.Primitives;
+using Microsoft.Windows.Controls.Core;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Interaction logic for RichTextBoxFormatBar.xaml
+ ///
+ public partial class RichTextBoxFormatBar : UserControl, IRichTextBoxFormatBar
+ {
+ #region Properties
+
+ #region RichTextBox
+
+ public static readonly DependencyProperty TargetProperty = DependencyProperty.Register("Target", typeof(global::System.Windows.Controls.RichTextBox), typeof(RichTextBoxFormatBar), new PropertyMetadata(null, OnRichTextBoxPropertyChanged));
+ public global::System.Windows.Controls.RichTextBox Target
+ {
+ get { return (global::System.Windows.Controls.RichTextBox)GetValue(TargetProperty); }
+ set { SetValue(TargetProperty, value); }
+ }
+
+ private static void OnRichTextBoxPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ RichTextBoxFormatBar formatBar = d as RichTextBoxFormatBar;
+ formatBar.HookupRichTextBoxEvents();
+ }
+
+ private void HookupRichTextBoxEvents()
+ {
+ Target.SelectionChanged += RichTextBox_SelectionChanged;
+ }
+
+ #endregion //RichTextBox
+
+ public static double[] FontSizes
+ {
+ get
+ {
+ return new double[] {
+ 3.0, 4.0, 5.0, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5,
+ 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 15.0,
+ 16.0, 17.0, 18.0, 19.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0,
+ 32.0, 34.0, 36.0, 38.0, 40.0, 44.0, 48.0, 52.0, 56.0, 60.0, 64.0, 68.0, 72.0, 76.0,
+ 80.0, 88.0, 96.0, 104.0, 112.0, 120.0, 128.0, 136.0, 144.0
+ };
+ }
+ }
+
+ #endregion
+
+ #region Constructors
+
+ public RichTextBoxFormatBar()
+ {
+ InitializeComponent();
+ Loaded += FormatToolbar_Loaded;
+ }
+
+ #endregion //Constructors
+
+ #region Event Hanlders
+
+ void FormatToolbar_Loaded(object sender, RoutedEventArgs e)
+ {
+ _cmbFontFamilies.ItemsSource = Fonts.SystemFontFamilies;
+ _cmbFontSizes.ItemsSource = FontSizes;
+ }
+
+ private void FontFamily_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (e.AddedItems.Count == 0)
+ return;
+
+ FontFamily editValue = (FontFamily)e.AddedItems[0];
+ ApplyPropertyValueToSelectedText(TextElement.FontFamilyProperty, editValue);
+ }
+
+ private void FontSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (e.AddedItems.Count == 0)
+ return;
+
+ ApplyPropertyValueToSelectedText(TextElement.FontSizeProperty, e.AddedItems[0]);
+ }
+
+ void RichTextBox_SelectionChanged(object sender, RoutedEventArgs e)
+ {
+ UpdateVisualState();
+ }
+
+ private void DragWidget_DragDelta(object sender, DragDeltaEventArgs e)
+ {
+ ProcessMove(e);
+ }
+
+ #endregion //Event Hanlders
+
+ #region Methods
+
+ private void UpdateVisualState()
+ {
+ UpdateToggleButtonState();
+ UpdateSelectedFontFamily();
+ UpdateSelectedFontSize();
+ }
+
+ private void UpdateToggleButtonState()
+ {
+ UpdateItemCheckedState(_btnBold, TextElement.FontWeightProperty, FontWeights.Bold);
+ UpdateItemCheckedState(_btnItalic, TextElement.FontStyleProperty, FontStyles.Italic);
+ UpdateItemCheckedState(_btnUnderline, Inline.TextDecorationsProperty, TextDecorations.Underline);
+
+ UpdateItemCheckedState(_btnAlignLeft, Paragraph.TextAlignmentProperty, TextAlignment.Left);
+ UpdateItemCheckedState(_btnAlignCenter, Paragraph.TextAlignmentProperty, TextAlignment.Center);
+ UpdateItemCheckedState(_btnAlignRight, Paragraph.TextAlignmentProperty, TextAlignment.Right);
+ }
+
+ void UpdateItemCheckedState(ToggleButton button, DependencyProperty formattingProperty, object expectedValue)
+ {
+ object currentValue = Target.Selection.GetPropertyValue(formattingProperty);
+ button.IsChecked = (currentValue == DependencyProperty.UnsetValue) ? false : currentValue != null && currentValue.Equals(expectedValue);
+ }
+
+ private void UpdateSelectedFontFamily()
+ {
+ object value = Target.Selection.GetPropertyValue(TextElement.FontFamilyProperty);
+ FontFamily currentFontFamily = (FontFamily)((value == DependencyProperty.UnsetValue) ? null : value);
+ if (currentFontFamily != null)
+ {
+ _cmbFontFamilies.SelectedItem = currentFontFamily;
+ }
+ }
+
+ private void UpdateSelectedFontSize()
+ {
+ object value = Target.Selection.GetPropertyValue(TextElement.FontSizeProperty);
+ _cmbFontSizes.SelectedValue = (value == DependencyProperty.UnsetValue) ? null : value;
+ }
+
+ void ApplyPropertyValueToSelectedText(DependencyProperty formattingProperty, object value)
+ {
+ if (value == null)
+ return;
+
+ Target.Selection.ApplyPropertyValue(formattingProperty, value);
+ }
+
+ private void ProcessMove(DragDeltaEventArgs e)
+ {
+ AdornerLayer layer = AdornerLayer.GetAdornerLayer(Target);
+ UIElementAdorner adorner = layer.GetAdorners(Target)[0] as UIElementAdorner;
+ adorner.SetOffsets(adorner.OffsetLeft + e.HorizontalChange, adorner.OffsetTop + e.VerticalChange);
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs
new file mode 100644
index 00000000..d7553cf7
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs
@@ -0,0 +1,187 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using Microsoft.Windows.Controls.Core;
+using System.Windows.Input;
+
+namespace Microsoft.Windows.Controls
+{
+ public class RichTextBoxFormatBarManager : DependencyObject
+ {
+ #region Members
+
+ private global::System.Windows.Controls.RichTextBox _richTextBox;
+ private UIElementAdorner _adorner;
+ private IRichTextBoxFormatBar _toolbar;
+
+ #endregion //Members
+
+ #region Properties
+
+ #region FormatBar
+
+ public static readonly DependencyProperty FormatBarProperty = DependencyProperty.RegisterAttached("FormatBar", typeof(IRichTextBoxFormatBar), typeof(RichTextBox), new PropertyMetadata(null, OnFormatBarPropertyChanged));
+ public static void SetFormatBar(UIElement element, IRichTextBoxFormatBar value)
+ {
+ element.SetValue(FormatBarProperty, value);
+ }
+ public static IRichTextBoxFormatBar GetFormatBar(UIElement element)
+ {
+ return (IRichTextBoxFormatBar)element.GetValue(FormatBarProperty);
+ }
+
+ private static void OnFormatBarPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ global::System.Windows.Controls.RichTextBox rtb = d as global::System.Windows.Controls.RichTextBox;
+ if (rtb == null)
+ throw new Exception("A FormatBar can only be applied to a RichTextBox.");
+
+ RichTextBoxFormatBarManager manager = new RichTextBoxFormatBarManager();
+ manager.AttachFormatBarToRichtextBox(rtb, e.NewValue as IRichTextBoxFormatBar);
+ }
+
+ #endregion //FormatBar
+
+ bool AdornerIsVisible
+ {
+ get { return _adorner.Visibility == Visibility.Visible; }
+ }
+
+ #endregion //Properties
+
+ #region Event Handlers
+
+ void RichTextBox_MouseButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ if (e.LeftButton == MouseButtonState.Released)
+ {
+ TextRange selectedText = new TextRange(_richTextBox.Selection.Start, _richTextBox.Selection.End);
+ if (selectedText.Text.Length > 0 && !String.IsNullOrWhiteSpace(selectedText.Text))
+ {
+ ShowAdorner();
+ }
+ else
+ {
+ HideAdorner();
+ }
+ }
+
+ e.Handled = true;
+ }
+
+ void RichTextBox_PreviewMouseMove(object sender, MouseEventArgs e)
+ {
+ //if the mouse moves outside the richtextbox bounds hide the adorner
+ //though this deosn't always work, especially if the user moves the mouse very quickly.
+ //need to find a better solution, but this will work for now.
+ Point p = e.GetPosition(_richTextBox);
+ if (p.X <= 5.0 || p.X >= _richTextBox.ActualWidth - 5 || p.Y <= 3.0 || p.Y >= _richTextBox.ActualHeight - 3)
+ HideAdorner();
+ }
+
+ void RichTextBox_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ //this fixes the bug when applying text transformations the text would lose it's highlight. That was because the RichTextBox was losing focus
+ //so we just give it focus again and it seems to do the trick of re-highlighting it.
+ if (!_richTextBox.IsFocused)
+ _richTextBox.Focus();
+ }
+
+ #endregion //Event Handlers
+
+ #region Methods
+
+ ///
+ /// Attaches a FormatBar to a RichtextBox
+ ///
+ /// The RichtextBox to attach to.
+ /// The Formatbar to attach.
+ private void AttachFormatBarToRichtextBox(global::System.Windows.Controls.RichTextBox richTextBox, IRichTextBoxFormatBar formatBar)
+ {
+ _richTextBox = richTextBox;
+ _richTextBox.PreviewMouseMove += RichTextBox_PreviewMouseMove;
+ //we cannot use the PreviewMouseLeftButtonUp event because of selection bugs.
+ //we cannot use the MouseLeftButtonUp event because it is handled by the RichTextBox and does not bubble up to here, so we must
+ //add a hander to the MouseUpEvent using the Addhandler syntax, and specify to listen for handled events too.
+ _richTextBox.AddHandler(Mouse.MouseUpEvent, new MouseButtonEventHandler(RichTextBox_MouseButtonUp), true);
+ _richTextBox.TextChanged += RichTextBox_TextChanged;
+
+ _adorner = new UIElementAdorner(_richTextBox);
+
+ formatBar.Target = _richTextBox;
+ _toolbar = formatBar;
+ }
+
+ ///
+ /// Shows the FormatBar
+ ///
+ void ShowAdorner()
+ {
+ VerifyAdornerLayer();
+
+ Control adorningEditor = _toolbar as Control;
+ _adorner.Child = adorningEditor;
+ _adorner.Visibility = Visibility.Visible;
+
+ PositionFormatBar(adorningEditor);
+ }
+
+ ///
+ /// Positions the FormatBar so that is does not go outside the bounds of the RichTextBox or covers the selected text
+ ///
+ ///
+ private void PositionFormatBar(Control adorningEditor)
+ {
+ Point mousePosition = Mouse.GetPosition(_richTextBox);
+
+ double left = mousePosition.X;
+ double top = (mousePosition.Y - 15) - adorningEditor.ActualHeight;
+
+ //top
+ if (top < 0)
+ {
+ top = mousePosition.Y + 10;
+ }
+
+ //right boundary
+ if (left + adorningEditor.ActualWidth > _richTextBox.ActualWidth - 20)
+ {
+ left = left - (adorningEditor.ActualWidth - (_richTextBox.ActualWidth - left));
+ }
+
+ _adorner.SetOffsets(left, top);
+ }
+
+ ///
+ /// Ensures that the IRichTextFormatBar is in the adorner layer.
+ ///
+ /// True if the IRichTextFormatBar is in the adorner layer, else false.
+ bool VerifyAdornerLayer()
+ {
+ if (_adorner.Parent != null)
+ return true;
+
+ AdornerLayer layer = AdornerLayer.GetAdornerLayer(_richTextBox);
+ if (layer == null)
+ return false;
+
+ layer.Add(_adorner);
+ return true;
+ }
+
+ ///
+ /// Hides the IRichTextFormatBar that is in the adornor layer.
+ ///
+ void HideAdorner()
+ {
+ if (AdornerIsVisible)
+ {
+ _adorner.Visibility = Visibility.Collapsed;
+ _adorner.Child = null;
+ }
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml
new file mode 100644
index 00000000..b2b3f717
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml
@@ -0,0 +1,1109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Collapsed
+
+
+
+
+
+
+ Collapsed
+
+
+
+
+
+
+
+
+
+
+ Visible
+
+
+
+
+
+
+ Visible
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/UpDownBase/UpDownBase.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/UpDownBase/UpDownBase.cs
new file mode 100644
index 00000000..aed90390
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/UpDownBase/UpDownBase.cs
@@ -0,0 +1,321 @@
+using System;
+using System.Windows.Input;
+using System.Windows.Controls;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ public abstract class UpDownBase : Control
+ {
+ #region Members
+
+ ///
+ /// Name constant for Text template part.
+ ///
+ internal const string ElementTextName = "Text";
+
+ ///
+ /// Name constant for Spinner template part.
+ ///
+ internal const string ElementSpinnerName = "Spinner";
+
+ ///
+ /// Flags if the Text and Value properties are in the process of being sync'd
+ ///
+ bool _isSyncingTextAndValueProperties;
+
+ #endregion //Members
+
+ #region Properties
+
+ #region Value
+
+ public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(T), typeof(UpDownBase), new FrameworkPropertyMetadata(default(T), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValuePropertyChanged));
+ public virtual T Value
+ {
+ get { return (T)GetValue(ValueProperty); }
+ set { SetValue(ValueProperty, value); }
+ }
+
+ private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ UpDownBase udb = (UpDownBase)d;
+ T oldValue = (T)e.OldValue;
+ T newValue = (T)e.NewValue;
+
+ udb.SyncTextAndValueProperties(e.Property, e.NewValue);
+
+ RoutedPropertyChangedEventArgs changedArgs = new RoutedPropertyChangedEventArgs(oldValue, newValue);
+ udb.OnValueChanged(changedArgs);
+ }
+
+ protected virtual void OnValueChanged(RoutedPropertyChangedEventArgs e)
+ {
+ if (ValueChanged != null)
+ ValueChanged(this, e);
+ }
+
+ #endregion //Value
+
+ #region Text
+
+ public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UpDownBase), new FrameworkPropertyMetadata("0", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextPropertyChanged));
+ public string Text
+ {
+ get { return (string)GetValue(TextProperty); }
+ set { SetValue(TextProperty, value); }
+ }
+
+ private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ UpDownBase udb = (UpDownBase)d;
+ udb.SyncTextAndValueProperties(e.Property, e.NewValue);
+ }
+
+ #endregion //Text
+
+ #region IsEditable
+
+ public static readonly DependencyProperty IsEditableProperty = DependencyProperty.Register("IsEditable", typeof(bool), typeof(UpDownBase), new PropertyMetadata(true, OnIsEditablePropertyChanged));
+ public bool IsEditable
+ {
+ get { return (bool)GetValue(IsEditableProperty); }
+ set { SetValue(IsEditableProperty, value); }
+ }
+
+ private static void OnIsEditablePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ UpDownBase source = d as UpDownBase;
+ source.OnIsEditableChanged((bool)e.OldValue, (bool)e.NewValue);
+ }
+
+ protected virtual void OnIsEditableChanged(bool oldValue, bool newValue)
+ {
+ if (TextBox != null)
+ TextBox.IsReadOnly = !IsEditable;
+ }
+
+ #endregion //IsEditable
+
+ internal TextBox TextBox { get; private set; }
+
+ private Spinner _spinner;
+ internal Spinner Spinner
+ {
+ get { return _spinner; }
+ private set
+ {
+ _spinner = value;
+ _spinner.Spin += OnSpinnerSpin;
+ }
+ }
+
+ #endregion //Properties
+
+ #region Constructors
+
+ protected UpDownBase() { }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ TextBox = GetTemplateChild(ElementTextName) as TextBox;
+ Spinner = GetTemplateChild(ElementSpinnerName) as Spinner;
+
+ if (TextBox != null)
+ TextBox.IsReadOnly = !IsEditable;
+ }
+
+ protected override void OnPreviewKeyDown(KeyEventArgs e)
+ {
+ switch (e.Key)
+ {
+ case Key.Up:
+ {
+ DoIncrement();
+ e.Handled = true;
+ break;
+ }
+ case Key.Down:
+ {
+ DoDecrement();
+ e.Handled = true;
+ break;
+ }
+ case Key.Enter:
+ {
+ SyncTextAndValueProperties(UpDownBase.TextProperty, TextBox.Text);
+ break;
+ }
+ }
+ }
+
+ protected override void OnMouseWheel(MouseWheelEventArgs e)
+ {
+ base.OnMouseWheel(e);
+
+ if (!e.Handled)
+ {
+ if (e.Delta < 0)
+ {
+ DoDecrement();
+ }
+ else if (0 < e.Delta)
+ {
+ DoIncrement();
+ }
+
+ e.Handled = true;
+ }
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Methods
+
+ #region Abstract
+
+ ///
+ /// Called by ApplyValue to parse user input.
+ ///
+ /// User input.
+ /// Value parsed from user input.
+ protected abstract T ParseValue(string text);
+
+ ///
+ /// Renders the value property into the textbox text.
+ ///
+ /// Formatted Value.
+ protected internal abstract string FormatValue();
+
+ ///
+ /// Called by OnSpin when the spin direction is SpinDirection.Increase.
+ ///
+ protected abstract void OnIncrement();
+
+ ///
+ /// Called by OnSpin when the spin direction is SpinDirection.Descrease.
+ ///
+ protected abstract void OnDecrement();
+
+ #endregion //Abstract
+
+ #region Protected
+
+ ///
+ /// GetValue override to return Value property as object type.
+ ///
+ /// The Value property as object type.
+ protected object GetValue()
+ {
+ return Value;
+ }
+
+ ///
+ /// SetValue override to set value to Value property.
+ ///
+ /// New value.
+ protected void SetValue(object value)
+ {
+ Value = (T)value;
+ }
+
+ #endregion //Protected
+
+ #region Private
+
+ ///
+ /// Performs an increment if conditions allow it.
+ ///
+ private void DoDecrement()
+ {
+ if (Spinner == null || (Spinner.ValidSpinDirection & ValidSpinDirections.Decrease) == ValidSpinDirections.Decrease)
+ {
+ OnDecrement();
+ }
+ }
+
+ ///
+ /// Performs a decrement if conditions allow it.
+ ///
+ private void DoIncrement()
+ {
+ if (Spinner == null || (Spinner.ValidSpinDirection & ValidSpinDirections.Increase) == ValidSpinDirections.Increase)
+ {
+ OnIncrement();
+ }
+ }
+
+ protected void SyncTextAndValueProperties(DependencyProperty p, object newValue)
+ {
+ //prevents recursive syncing properties
+ if (_isSyncingTextAndValueProperties)
+ return;
+
+ _isSyncingTextAndValueProperties = true;
+
+ //this only occures when the user typed in the value
+ if (UpDownBase.TextProperty == p)
+ {
+ SetValue(UpDownBase.ValueProperty, ParseValue(newValue.ToString()));
+ }
+
+ //we need to update the text no matter what because the user could have used the spin buttons to change dthe value
+ //or typed in the textbox so we need to reformat the entered value.
+ SetValue(UpDownBase.TextProperty, FormatValue());
+
+ _isSyncingTextAndValueProperties = false;
+ }
+
+ #endregion //Private
+
+ #region Virtual
+
+ ///
+ /// Occurs when the spinner spins.
+ ///
+ /// Event args.
+ protected virtual void OnSpin(SpinEventArgs e)
+ {
+ if (e == null)
+ throw new ArgumentNullException("e");
+
+ if (e.Direction == SpinDirection.Increase)
+ DoIncrement();
+ else
+ DoDecrement();
+ }
+
+ #endregion //Virtual
+
+ #endregion //Methods
+
+ #region Event Handlers
+
+ ///
+ /// Event handler for Spinner template part's Spin event.
+ ///
+ /// The Spinner template part.
+ /// Event args.
+ private void OnSpinnerSpin(object sender, SpinEventArgs e)
+ {
+ OnSpin(e);
+ }
+
+ #endregion //Event Handlers
+
+ #region Events
+
+ ///
+ /// Occurs when Value property has changed.
+ ///
+ public event RoutedPropertyChangedEventHandler ValueChanged;
+
+ #endregion //Events
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/VisualStates.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/VisualStates.cs
new file mode 100644
index 00000000..721a96e2
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/VisualStates.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static partial class VisualStates
+ {
+
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj
new file mode 100644
index 00000000..738ae7e2
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj
@@ -0,0 +1,157 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}
+ library
+ Properties
+ Microsoft.Windows.Controls
+ WPFToolkit.Extended
+ v4.0
+ Client
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ Designer
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+ RichTextBoxFormatBar.xaml
+
+
+
+
+
+
+
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj.vspscc b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj.vspscc
new file mode 100644
index 00000000..feffdeca
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = ""
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/ExtendedWPFToolkit.sln b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/ExtendedWPFToolkit.sln
new file mode 100644
index 00000000..e1ed3032
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/ExtendedWPFToolkit.sln
@@ -0,0 +1,29 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFToolkit.Extended", "Src\WPFToolkit.Extended\WPFToolkit.Extended.csproj", "{72E591D6-8F83-4D8C-8F67-9C325E623234}"
+EndProject
+Global
+ GlobalSection(TeamFoundationVersionControl) = preSolution
+ SccNumberOfProjects = 2
+ SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
+ SccTeamFoundationServer = https://tfs.codeplex.com/tfs/TFS02
+ SccLocalPath0 = .
+ SccProjectUniqueName1 = Src\\WPFToolkit.Extended\\WPFToolkit.Extended.csproj
+ SccProjectName1 = Src/WPFToolkit.Extended
+ SccLocalPath1 = Src\\WPFToolkit.Extended
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/ExtendedWPFToolkit.vssscc b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/ExtendedWPFToolkit.vssscc
new file mode 100644
index 00000000..794f014c
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/ExtendedWPFToolkit.vssscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = ""
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT"
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/BusyIndicator/BusyIndicator.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/BusyIndicator/BusyIndicator.cs
new file mode 100644
index 00000000..6a73cd8f
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/BusyIndicator/BusyIndicator.cs
@@ -0,0 +1,266 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Shapes;
+using System.Windows.Threading;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// A control to provide a visual indicator when an application is busy.
+ ///
+ [TemplateVisualState(Name = VisualStates.StateIdle, GroupName = VisualStates.GroupBusyStatus)]
+ [TemplateVisualState(Name = VisualStates.StateBusy, GroupName = VisualStates.GroupBusyStatus)]
+ [TemplateVisualState(Name = VisualStates.StateVisible, GroupName = VisualStates.GroupVisibility)]
+ [TemplateVisualState(Name = VisualStates.StateHidden, GroupName = VisualStates.GroupVisibility)]
+ [StyleTypedProperty(Property = "OverlayStyle", StyleTargetType = typeof(Rectangle))]
+ [StyleTypedProperty(Property = "ProgressBarStyle", StyleTargetType = typeof(ProgressBar))]
+ public class BusyIndicator : ContentControl
+ {
+ #region Private Members
+
+ ///
+ /// Timer used to delay the initial display and avoid flickering.
+ ///
+ private DispatcherTimer _displayAfterTimer = new DispatcherTimer();
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static BusyIndicator()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(BusyIndicator), new FrameworkPropertyMetadata(typeof(BusyIndicator)));
+ }
+
+ public BusyIndicator()
+ {
+ _displayAfterTimer.Tick += DisplayAfterTimerElapsed;
+ }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ ///
+ /// Overrides the OnApplyTemplate method.
+ ///
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+ ChangeVisualState(false);
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Properties
+
+ ///
+ /// Gets or sets a value indicating whether the BusyContent is visible.
+ ///
+ protected bool IsContentVisible { get; set; }
+
+ #endregion //Properties
+
+ #region Dependency Properties
+
+ #region IsBusy
+
+ ///
+ /// Identifies the IsBusy dependency property.
+ ///
+ public static readonly DependencyProperty IsBusyProperty = DependencyProperty.Register(
+ "IsBusy",
+ typeof(bool),
+ typeof(BusyIndicator),
+ new PropertyMetadata(false, new PropertyChangedCallback(OnIsBusyChanged)));
+
+ ///
+ /// Gets or sets a value indicating whether the busy indicator should show.
+ ///
+ public bool IsBusy
+ {
+ get { return (bool)GetValue(IsBusyProperty); }
+ set { SetValue(IsBusyProperty, value); }
+ }
+
+ ///
+ /// IsBusyProperty property changed handler.
+ ///
+ /// BusyIndicator that changed its IsBusy.
+ /// Event arguments.
+ private static void OnIsBusyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ((BusyIndicator)d).OnIsBusyChanged(e);
+ }
+
+ ///
+ /// IsBusyProperty property changed handler.
+ ///
+ /// Event arguments.
+ protected virtual void OnIsBusyChanged(DependencyPropertyChangedEventArgs e)
+ {
+ if (IsBusy)
+ {
+ if (DisplayAfter.Equals(TimeSpan.Zero))
+ {
+ // Go visible now
+ IsContentVisible = true;
+ }
+ else
+ {
+ // Set a timer to go visible
+ _displayAfterTimer.Interval = DisplayAfter;
+ _displayAfterTimer.Start();
+ }
+ }
+ else
+ {
+ // No longer visible
+ _displayAfterTimer.Stop();
+ IsContentVisible = false;
+ }
+
+ ChangeVisualState(true);
+ }
+
+ #endregion //IsBusy
+
+ #region Busy Content
+
+ ///
+ /// Identifies the BusyContent dependency property.
+ ///
+ public static readonly DependencyProperty BusyContentProperty = DependencyProperty.Register(
+ "BusyContent",
+ typeof(object),
+ typeof(BusyIndicator),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets a value indicating the busy content to display to the user.
+ ///
+ public object BusyContent
+ {
+ get { return (object)GetValue(BusyContentProperty); }
+ set { SetValue(BusyContentProperty, value); }
+ }
+
+ #endregion //Busy Content
+
+ #region Busy Content Template
+
+ ///
+ /// Identifies the BusyTemplate dependency property.
+ ///
+ public static readonly DependencyProperty BusyContentTemplateProperty = DependencyProperty.Register(
+ "BusyContentTemplate",
+ typeof(DataTemplate),
+ typeof(BusyIndicator),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets a value indicating the template to use for displaying the busy content to the user.
+ ///
+ public DataTemplate BusyContentTemplate
+ {
+ get { return (DataTemplate)GetValue(BusyContentTemplateProperty); }
+ set { SetValue(BusyContentTemplateProperty, value); }
+ }
+
+ #endregion //Busy Content Template
+
+ #region Display After
+
+ ///
+ /// Identifies the DisplayAfter dependency property.
+ ///
+ public static readonly DependencyProperty DisplayAfterProperty = DependencyProperty.Register(
+ "DisplayAfter",
+ typeof(TimeSpan),
+ typeof(BusyIndicator),
+ new PropertyMetadata(TimeSpan.FromSeconds(0.1)));
+
+ ///
+ /// Gets or sets a value indicating how long to delay before displaying the busy content.
+ ///
+ public TimeSpan DisplayAfter
+ {
+ get { return (TimeSpan)GetValue(DisplayAfterProperty); }
+ set { SetValue(DisplayAfterProperty, value); }
+ }
+
+ #endregion //Display After
+
+ #region Overlay Style
+
+ ///
+ /// Identifies the OverlayStyle dependency property.
+ ///
+ public static readonly DependencyProperty OverlayStyleProperty = DependencyProperty.Register(
+ "OverlayStyle",
+ typeof(Style),
+ typeof(BusyIndicator),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets a value indicating the style to use for the overlay.
+ ///
+ public Style OverlayStyle
+ {
+ get { return (Style)GetValue(OverlayStyleProperty); }
+ set { SetValue(OverlayStyleProperty, value); }
+ }
+ #endregion //Overlay Style
+
+ #region ProgressBar Style
+
+ ///
+ /// Identifies the ProgressBarStyle dependency property.
+ ///
+ public static readonly DependencyProperty ProgressBarStyleProperty = DependencyProperty.Register(
+ "ProgressBarStyle",
+ typeof(Style),
+ typeof(BusyIndicator),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets a value indicating the style to use for the progress bar.
+ ///
+ public Style ProgressBarStyle
+ {
+ get { return (Style)GetValue(ProgressBarStyleProperty); }
+ set { SetValue(ProgressBarStyleProperty, value); }
+ }
+
+ #endregion //ProgressBar Style
+
+ #endregion //Dependency Properties
+
+ #region Methods
+
+ ///
+ /// Handler for the DisplayAfterTimer.
+ ///
+ /// Event sender.
+ /// Event arguments.
+ private void DisplayAfterTimerElapsed(object sender, EventArgs e)
+ {
+ _displayAfterTimer.Stop();
+ IsContentVisible = true;
+ ChangeVisualState(true);
+ }
+
+ ///
+ /// Changes the control's visual state(s).
+ ///
+ /// True if state transitions should be used.
+ protected virtual void ChangeVisualState(bool useTransitions)
+ {
+ VisualStateManager.GoToState(this, IsBusy ? VisualStates.StateBusy : VisualStates.StateIdle, useTransitions);
+ VisualStateManager.GoToState(this, IsContentVisible ? VisualStates.StateVisible : VisualStates.StateHidden, useTransitions);
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/BusyIndicator/VisualStates.BusyIndicator.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/BusyIndicator/VisualStates.BusyIndicator.cs
new file mode 100644
index 00000000..5d78d952
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/BusyIndicator/VisualStates.BusyIndicator.cs
@@ -0,0 +1,37 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static partial class VisualStates
+ {
+ ///
+ /// Busyness group name.
+ ///
+ public const string GroupBusyStatus = "BusyStatusStates";
+
+ ///
+ /// Busy state for BusyIndicator.
+ ///
+ public const string StateBusy = "Busy";
+
+ ///
+ /// Idle state for BusyIndicator.
+ ///
+ public const string StateIdle = "Idle";
+
+ ///
+ /// BusyDisplay group.
+ ///
+ public const string GroupVisibility = "VisibilityStates";
+
+ ///
+ /// Visible state name for BusyIndicator.
+ ///
+ public const string StateVisible = "Visible";
+
+ ///
+ /// Hidden state name for BusyIndicator.
+ ///
+ public const string StateHidden = "Hidden";
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/ButtonSpinner.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/ButtonSpinner.cs
new file mode 100644
index 00000000..b2c2ad99
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/ButtonSpinner.cs
@@ -0,0 +1,191 @@
+using System;
+using System.Windows;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Controls.Primitives;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Represents a spinner control that includes two Buttons.
+ ///
+ [ContentProperty("Content")]
+ public class ButtonSpinner : Spinner
+ {
+ #region Properties
+
+ #region Content
+
+ ///
+ /// Identifies the Content dependency property.
+ ///
+ public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(ButtonSpinner), new PropertyMetadata(null, OnContentPropertyChanged));
+ public object Content
+ {
+ get { return GetValue(ContentProperty) as object; }
+ set { SetValue(ContentProperty, value); }
+ }
+
+ ///
+ /// ContentProperty property changed handler.
+ ///
+ /// ButtonSpinner that changed its Content.
+ /// Event arguments.
+ private static void OnContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ButtonSpinner source = d as ButtonSpinner;
+ source.OnContentChanged(e.OldValue, e.NewValue);
+ }
+
+ #endregion //Content
+
+ private ButtonBase _increaseButton;
+ ///
+ /// Gets or sets the IncreaseButton template part.
+ ///
+ private ButtonBase IncreaseButton
+ {
+ get { return _increaseButton; }
+ set
+ {
+ if (_increaseButton != null)
+ {
+ _increaseButton.Click -= OnButtonClick;
+ }
+
+ _increaseButton = value;
+
+ if (_increaseButton != null)
+ {
+ _increaseButton.Click += OnButtonClick;
+ }
+ }
+ }
+
+
+ private ButtonBase _decreaseButton;
+ ///
+ /// Gets or sets the DecreaseButton template part.
+ ///
+ private ButtonBase DecreaseButton
+ {
+ get { return _decreaseButton; }
+ set
+ {
+ if (_decreaseButton != null)
+ {
+ _decreaseButton.Click -= OnButtonClick;
+ }
+
+ _decreaseButton = value;
+
+ if (_decreaseButton != null)
+ {
+ _decreaseButton.Click += OnButtonClick;
+ }
+ }
+ }
+
+ #endregion //Properties
+
+ #region Constructors
+
+ static ButtonSpinner()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonSpinner), new FrameworkPropertyMetadata(typeof(ButtonSpinner)));
+ }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ IncreaseButton = GetTemplateChild("IncreaseButton") as ButtonBase;
+ DecreaseButton = GetTemplateChild("DecreaseButton") as ButtonBase;
+
+ SetButtonUsage();
+ }
+
+ #endregion //Base Class Overrides
+
+ ///
+ /// Occurs when the Content property value changed.
+ ///
+ /// The old value of the Content property.
+ /// The new value of the Content property.
+ protected virtual void OnContentChanged(object oldValue, object newValue) { }
+
+ ///
+ /// Handle click event of IncreaseButton and DecreaseButton template parts,
+ /// translating Click to appropriate Spin event.
+ ///
+ /// Event sender, should be either IncreaseButton or DecreaseButton template part.
+ /// Event args.
+ private void OnButtonClick(object sender, RoutedEventArgs e)
+ {
+ SpinDirection direction = sender == IncreaseButton ? SpinDirection.Increase : SpinDirection.Decrease;
+ OnSpin(new SpinEventArgs(direction));
+ }
+
+ ///
+ /// Cancel LeftMouseButtonUp events originating from a button that has
+ /// been changed to disabled.
+ ///
+ /// The data for the event.
+ protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
+ {
+ base.OnMouseLeftButtonUp(e);
+
+ Point mousePosition;
+ if (IncreaseButton != null && IncreaseButton.IsEnabled == false)
+ {
+ mousePosition = e.GetPosition(IncreaseButton);
+ if (mousePosition.X > 0 && mousePosition.X < IncreaseButton.ActualWidth &&
+ mousePosition.Y > 0 && mousePosition.Y < IncreaseButton.ActualHeight)
+ {
+ e.Handled = true;
+ }
+ }
+
+ if (DecreaseButton != null && DecreaseButton.IsEnabled == false)
+ {
+ mousePosition = e.GetPosition(DecreaseButton);
+ if (mousePosition.X > 0 && mousePosition.X < DecreaseButton.ActualWidth &&
+ mousePosition.Y > 0 && mousePosition.Y < DecreaseButton.ActualHeight)
+ {
+ e.Handled = true;
+ }
+ }
+ }
+
+ ///
+ /// Called when valid spin direction changed.
+ ///
+ /// The old value.
+ /// The new value.
+ protected override void OnValidSpinDirectionChanged(ValidSpinDirections oldValue, ValidSpinDirections newValue)
+ {
+ SetButtonUsage();
+ }
+
+ ///
+ /// Disables or enables the buttons based on the valid spin direction.
+ ///
+ private void SetButtonUsage()
+ {
+ // buttonspinner adds buttons that spin, so disable accordingly.
+ if (IncreaseButton != null)
+ {
+ IncreaseButton.IsEnabled = ((ValidSpinDirection & ValidSpinDirections.Increase) == ValidSpinDirections.Increase);
+ }
+
+ if (DecreaseButton != null)
+ {
+ DecreaseButton.IsEnabled = ((ValidSpinDirection & ValidSpinDirections.Decrease) == ValidSpinDirections.Decrease);
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/SpinDirection.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/SpinDirection.cs
new file mode 100644
index 00000000..aaa121fb
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/SpinDirection.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Represents spin directions that could be initiated by the end-user.
+ ///
+ /// Preview
+ public enum SpinDirection
+ {
+ ///
+ /// Represents a spin initiated by the end-user in order to Increase a value.
+ ///
+ Increase = 0,
+
+ ///
+ /// Represents a spin initiated by the end-user in order to Decrease a value.
+ ///
+ Decrease = 1
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/SpinEventArgs.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/SpinEventArgs.cs
new file mode 100644
index 00000000..f8a89385
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/SpinEventArgs.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Provides data for the Spinner.Spin event.
+ ///
+ /// Preview
+ public class SpinEventArgs : RoutedEventArgs
+ {
+ ///
+ /// Gets the SpinDirection for the spin that has been initiated by the
+ /// end-user.
+ ///
+ public SpinDirection Direction { get; private set; }
+
+ ///
+ /// Initializes a new instance of the SpinEventArgs class.
+ ///
+ /// Spin direction.
+ public SpinEventArgs(SpinDirection direction)
+ : base()
+ {
+ Direction = direction;
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/Spinner.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/Spinner.cs
new file mode 100644
index 00000000..20b8d1cb
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/Spinner.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Windows.Controls;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Base class for controls that represents controls that can spin.
+ ///
+ public abstract class Spinner : Control
+ {
+ #region Properties
+
+ ///
+ /// Identifies the ValidSpinDirection dependency property.
+ ///
+ public static readonly DependencyProperty ValidSpinDirectionProperty = DependencyProperty.Register("ValidSpinDirection", typeof(ValidSpinDirections), typeof(Spinner), new PropertyMetadata(ValidSpinDirections.Increase | ValidSpinDirections.Decrease, OnValidSpinDirectionPropertyChanged));
+ public ValidSpinDirections ValidSpinDirection
+ {
+ get { return (ValidSpinDirections)GetValue(ValidSpinDirectionProperty); }
+ set { SetValue(ValidSpinDirectionProperty, value); }
+ }
+
+ ///
+ /// ValidSpinDirectionProperty property changed handler.
+ ///
+ /// ButtonSpinner that changed its ValidSpinDirection.
+ /// Event arguments.
+ private static void OnValidSpinDirectionPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ Spinner source = (Spinner)d;
+ ValidSpinDirections oldvalue = (ValidSpinDirections)e.OldValue;
+ ValidSpinDirections newvalue = (ValidSpinDirections)e.NewValue;
+ source.OnValidSpinDirectionChanged(oldvalue, newvalue);
+ }
+
+ #endregion //Properties
+
+ ///
+ /// Occurs when spinning is initiated by the end-user.
+ ///
+ public event EventHandler Spin;
+
+ ///
+ /// Initializes a new instance of the Spinner class.
+ ///
+ protected Spinner() { }
+
+ ///
+ /// Raises the OnSpin event when spinning is initiated by the end-user.
+ ///
+ /// Spin event args.
+ protected virtual void OnSpin(SpinEventArgs e)
+ {
+ ValidSpinDirections valid = e.Direction == SpinDirection.Increase ? ValidSpinDirections.Increase : ValidSpinDirections.Decrease;
+
+ if ((ValidSpinDirection & valid) != valid)
+ {
+ // spin is not allowed.
+ throw new InvalidOperationException("Spin action is not valid at this moment.");
+ }
+
+ EventHandler handler = Spin;
+ if (handler != null)
+ {
+ handler(this, e);
+ }
+ }
+
+ ///
+ /// Called when valid spin direction changed.
+ ///
+ /// The old value.
+ /// The new value.
+ protected virtual void OnValidSpinDirectionChanged(ValidSpinDirections oldValue, ValidSpinDirections newValue) { }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/ValidSpinDirections.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/ValidSpinDirections.cs
new file mode 100644
index 00000000..d744620d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ButtonSpinner/ValidSpinDirections.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Represents spin directions that are valid.
+ ///
+ [Flags]
+ public enum ValidSpinDirections
+ {
+ ///
+ /// Can not increase nor decrease.
+ ///
+ None = 0,
+
+ ///
+ /// Can increase.
+ ///
+ Increase = 1,
+
+ ///
+ /// Can decrease.
+ ///
+ Decrease = 2
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/ChildWindow.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/ChildWindow.cs
new file mode 100644
index 00000000..8a44695d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/ChildWindow.cs
@@ -0,0 +1,482 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Controls.Primitives;
+using System.ComponentModel;
+
+namespace Microsoft.Windows.Controls
+{
+ [TemplateVisualState(GroupName = VisualStates.WindowStatesGroup, Name = VisualStates.Open)]
+ [TemplateVisualState(GroupName = VisualStates.WindowStatesGroup, Name = VisualStates.Closed)]
+ public class ChildWindow : ContentControl
+ {
+ #region Private Members
+
+ private TranslateTransform _moveTransform = new TranslateTransform();
+ private bool _startupPositionInitialized;
+ private bool _isMouseCaptured;
+ private Point _clickPoint;
+ private Point _oldPosition;
+ private Border _dragWidget;
+ private FrameworkElement _parent;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static ChildWindow()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ChildWindow), new FrameworkPropertyMetadata(typeof(ChildWindow)));
+ }
+
+ public ChildWindow()
+ {
+ LayoutUpdated += (o, e) =>
+ {
+ //we only want to set the start position if this is the first time the control has bee initialized
+ if (!_startupPositionInitialized)
+ {
+ SetStartupPosition();
+ _startupPositionInitialized = true;
+ }
+ };
+ }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ _dragWidget = (Border)GetTemplateChild("PART_DragWidget");
+ if (_dragWidget != null)
+ {
+ _dragWidget.AddHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(HeaderLeftMouseButtonDown), true);
+ _dragWidget.AddHandler(UIElement.MouseLeftButtonUpEvent, new MouseButtonEventHandler(HeaderMouseLeftButtonUp), true);
+ _dragWidget.MouseMove += (o, e) => HeaderMouseMove(e);
+ }
+
+ CloseButton = (Button)GetTemplateChild("PART_CloseButton");
+ if (CloseButton != null)
+ CloseButton.Click += (o, e) => Close();
+
+ Overlay = GetTemplateChild("PART_Overlay") as Panel;
+ WindowRoot = GetTemplateChild("PART_WindowRoot") as Grid;
+
+ WindowRoot.RenderTransform = _moveTransform;
+
+ //TODO: move somewhere else
+ _parent = VisualTreeHelper.GetParent(this) as FrameworkElement;
+ _parent.SizeChanged += (o, ea) =>
+ {
+ Overlay.Height = ea.NewSize.Height;
+ Overlay.Width = ea.NewSize.Width;
+ };
+
+ ChangeVisualState();
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Properties
+
+ #region Internal Properties
+
+ internal Panel Overlay { get; private set; }
+ internal Grid WindowRoot { get; private set; }
+ internal Thumb DragWidget { get; private set; }
+ internal Button MinimizeButton { get; private set; }
+ internal Button MaximizeButton { get; private set; }
+ internal Button CloseButton { get; private set; }
+
+ #endregion //Internal Properties
+
+ #region Dependency Properties
+
+ public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(ChildWindow), new UIPropertyMetadata(String.Empty));
+ public string Caption
+ {
+ get { return (string)GetValue(CaptionProperty); }
+ set { SetValue(CaptionProperty, value); }
+ }
+
+ public static readonly DependencyProperty CaptionForegroundProperty = DependencyProperty.Register("CaptionForeground", typeof(Brush), typeof(ChildWindow), new UIPropertyMetadata(null));
+ public Brush CaptionForeground
+ {
+ get { return (Brush)GetValue(CaptionForegroundProperty); }
+ set { SetValue(CaptionForegroundProperty, value); }
+ }
+
+ public static readonly DependencyProperty CloseButtonStyleProperty = DependencyProperty.Register("CloseButtonStyle", typeof(Style), typeof(ChildWindow), new PropertyMetadata(null));
+ public Style CloseButtonStyle
+ {
+ get { return (Style)GetValue(CloseButtonStyleProperty); }
+ set { SetValue(CloseButtonStyleProperty, value); }
+ }
+
+ public static readonly DependencyProperty CloseButtonVisibilityProperty = DependencyProperty.Register("CloseButtonVisibility", typeof(Visibility), typeof(ChildWindow), new PropertyMetadata(Visibility.Visible));
+ public Visibility CloseButtonVisibility
+ {
+ get { return (Visibility)GetValue(CloseButtonVisibilityProperty); }
+ set { SetValue(CloseButtonVisibilityProperty, value); }
+ }
+
+ public static readonly DependencyProperty IconSourceProperty = DependencyProperty.Register("Icon", typeof(ImageSource), typeof(ChildWindow), new UIPropertyMetadata(default(ImageSource)));
+ public ImageSource Icon
+ {
+ get { return (ImageSource)GetValue(IconSourceProperty); }
+ set { SetValue(IconSourceProperty, value); }
+ }
+
+ public static readonly DependencyProperty IsModalProperty = DependencyProperty.Register("IsModal", typeof(bool), typeof(ChildWindow), new UIPropertyMetadata(true));
+ public bool IsModal
+ {
+ get { return (bool)GetValue(IsModalProperty); }
+ set { SetValue(IsModalProperty, value); }
+ }
+
+ #region Left
+
+ public static readonly DependencyProperty LeftProperty = DependencyProperty.Register("Left", typeof(double), typeof(ChildWindow), new PropertyMetadata(0.0, new PropertyChangedCallback(OnLeftPropertyChanged)));
+ public double Left
+ {
+ get { return (double)GetValue(LeftProperty); }
+ set { SetValue(LeftProperty, value); }
+ }
+
+ private static void OnLeftPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ ChildWindow window = (ChildWindow)obj;
+ window.Left = window.GetRestrictedLeft();
+ window.ProcessMove((double)e.NewValue - (double)e.OldValue, 0);
+ }
+
+ #endregion //Left
+
+ #region OverlayBrush
+
+ public static readonly DependencyProperty OverlayBrushProperty = DependencyProperty.Register("OverlayBrush", typeof(Brush), typeof(ChildWindow));
+ public Brush OverlayBrush
+ {
+ get { return (Brush)GetValue(OverlayBrushProperty); }
+ set { SetValue(OverlayBrushProperty, value); }
+ }
+
+ #endregion //OverlayBrush
+
+ #region OverlayOpacity
+
+ public static readonly DependencyProperty OverlayOpacityProperty = DependencyProperty.Register("OverlayOpacity", typeof(double), typeof(ChildWindow));
+ public double OverlayOpacity
+ {
+ get { return (double)GetValue(OverlayOpacityProperty); }
+ set { SetValue(OverlayOpacityProperty, value); }
+ }
+
+ #endregion //OverlayOpacity
+
+ #region Top
+
+ public static readonly DependencyProperty TopProperty = DependencyProperty.Register("Top", typeof(double), typeof(ChildWindow), new PropertyMetadata(0.0, new PropertyChangedCallback(OnTopPropertyChanged)));
+ public double Top
+ {
+ get { return (double)GetValue(TopProperty); }
+ set { SetValue(TopProperty, value); }
+ }
+
+ private static void OnTopPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ ChildWindow window = (ChildWindow)obj;
+ window.Top = window.GetRestrictedTop();
+ window.ProcessMove(0, (double)e.NewValue - (double)e.OldValue);
+ }
+
+ #endregion //TopProperty
+
+ public static readonly DependencyProperty WindowBackgroundProperty = DependencyProperty.Register("WindowBackground", typeof(Brush), typeof(ChildWindow), new PropertyMetadata(null));
+ public Brush WindowBackground
+ {
+ get { return (Brush)GetValue(WindowBackgroundProperty); }
+ set { SetValue(WindowBackgroundProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowBorderBrushProperty = DependencyProperty.Register("WindowBorderBrush", typeof(Brush), typeof(ChildWindow), new PropertyMetadata(null));
+ public Brush WindowBorderBrush
+ {
+ get { return (Brush)GetValue(WindowBorderBrushProperty); }
+ set { SetValue(WindowBorderBrushProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowOpacityProperty = DependencyProperty.Register("WindowOpacity", typeof(double), typeof(ChildWindow), new PropertyMetadata(null));
+ public double WindowOpacity
+ {
+ get { return (double)GetValue(WindowOpacityProperty); }
+ set { SetValue(WindowOpacityProperty, value); }
+ }
+
+ #region WindowState
+
+ public static readonly DependencyProperty WindowStateProperty = DependencyProperty.Register("WindowState", typeof(WindowState), typeof(ChildWindow), new PropertyMetadata(WindowState.Open, new PropertyChangedCallback(OnWindowStatePropertyChanged)));
+ public WindowState WindowState
+ {
+ get { return (WindowState)GetValue(WindowStateProperty); }
+ set { SetValue(WindowStateProperty, value); }
+ }
+
+ private static void OnWindowStatePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ ChildWindow window = (ChildWindow)obj;
+ window.SetWindowState((WindowState)e.NewValue);
+ }
+
+ #endregion //WindowState
+
+ #endregion //Dependency Properties
+
+ private bool? _dialogResult;
+ ///
+ /// Gets or sets a value indicating whether the ChildWindow was accepted or canceled.
+ ///
+ ///
+ /// True if the child window was accepted; false if the child window was
+ /// canceled. The default is null.
+ ///
+ [TypeConverter(typeof(NullableBoolConverter))]
+ public bool? DialogResult
+ {
+ get { return _dialogResult; }
+ set
+ {
+ if (_dialogResult != value)
+ {
+ _dialogResult = value;
+ Close();
+ }
+ }
+ }
+
+ #endregion //Properties
+
+ #region Event Handlers
+
+ void HeaderLeftMouseButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ e.Handled = true;
+ Focus();
+ _dragWidget.CaptureMouse();
+ _isMouseCaptured = true;
+ _clickPoint = e.GetPosition(null); //save off the mouse position
+ _oldPosition = new Point(Left, Top); //save off our original window position
+ }
+
+ private void HeaderMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ e.Handled = true;
+ _dragWidget.ReleaseMouseCapture();
+ _isMouseCaptured = false;
+ }
+
+ private void HeaderMouseMove(MouseEventArgs e)
+ {
+ if (_isMouseCaptured && Visibility == Visibility.Visible)
+ {
+ Point currentPosition = e.GetPosition(null); //our current mouse position
+
+ Left = _oldPosition.X + (currentPosition.X - _clickPoint.X);
+ Top = _oldPosition.Y + (currentPosition.Y - _clickPoint.Y);
+
+ //this helps keep our mouse position in sync with the drag widget position
+ Point dragWidgetPosition = e.GetPosition(_dragWidget);
+ if (dragWidgetPosition.X < 0 || dragWidgetPosition.X > _dragWidget.ActualWidth || dragWidgetPosition.Y < 0 || dragWidgetPosition.Y > _dragWidget.ActualHeight)
+ {
+ return;
+ }
+
+ _oldPosition = new Point(Left, Top);
+ _clickPoint = e.GetPosition(Window.GetWindow(this)); //store the point where we are relative to the window
+ }
+ }
+
+ #endregion //Event Handlers
+
+ #region Methods
+
+ #region Private
+
+ private double GetRestrictedLeft()
+ {
+ if (_parent != null)
+ {
+ if (Left < 0)
+ {
+ return 0;
+ }
+
+ if (Left + WindowRoot.ActualWidth > _parent.ActualWidth)
+ {
+ return _parent.ActualWidth - WindowRoot.ActualWidth;
+ }
+ }
+
+ return Left;
+ }
+
+ private double GetRestrictedTop()
+ {
+ if (_parent != null)
+ {
+ if (Top < 0)
+ {
+ return 0;
+ }
+
+ if (Top + WindowRoot.ActualHeight > _parent.ActualHeight)
+ {
+ return _parent.ActualHeight - WindowRoot.ActualHeight;
+ }
+ }
+
+ return Top;
+ }
+
+ private void SetWindowState(WindowState state)
+ {
+ switch (state)
+ {
+ case WindowState.Closed:
+ {
+ ExecuteClose();
+ break;
+ }
+ case WindowState.Open:
+ {
+ ExecuteOpen();
+ break;
+ }
+ }
+
+ ChangeVisualState();
+ }
+
+ private void ExecuteClose()
+ {
+ CancelEventArgs e = new CancelEventArgs();
+ OnClosing(e);
+
+ if (!e.Cancel)
+ {
+ if (!_dialogResult.HasValue)
+ _dialogResult = false;
+
+ OnClosed(EventArgs.Empty);
+ }
+ else
+ {
+ _dialogResult = null; //if the Close is cancelled, DialogResult should always be NULL:
+ }
+ }
+
+ private void ExecuteOpen()
+ {
+ _dialogResult = null; //reset the dialogResult to null each time the window is opened
+ SetZIndex();
+ }
+
+ private void SetZIndex()
+ {
+ if (_parent != null)
+ {
+ int parentIndex = (int)_parent.GetValue(Canvas.ZIndexProperty);
+ this.SetValue(Canvas.ZIndexProperty, ++parentIndex);
+ }
+ else
+ {
+ this.SetValue(Canvas.ZIndexProperty, 1);
+ }
+ }
+
+ private void SetStartupPosition()
+ {
+ CenterChildWindow();
+ }
+
+ private void CenterChildWindow()
+ {
+ _moveTransform.X = _moveTransform.Y = 0;
+
+ if (_parent != null)
+ {
+ Left = (_parent.ActualWidth - WindowRoot.ActualWidth) / 2.0;
+ Top = (_parent.ActualHeight - WindowRoot.ActualHeight) / 2.0;
+ }
+ }
+
+ protected virtual void ChangeVisualState()
+ {
+ if (WindowState == WindowState.Closed)
+ {
+ VisualStateManager.GoToState(this, VisualStates.Closed, true);
+ }
+ else
+ {
+ VisualStateManager.GoToState(this, VisualStates.Open, true);
+ }
+ }
+
+ #endregion //Private
+
+ #region Protected
+
+ protected void ProcessMove(double x, double y)
+ {
+ _moveTransform.X += x;
+ _moveTransform.Y += y;
+ }
+
+ #endregion //Protected
+
+ #region Public
+
+ public void Show()
+ {
+ WindowState = WindowState.Open;
+ }
+
+ public void Close()
+ {
+ WindowState = WindowState.Closed;
+ }
+
+ #endregion //Public
+
+ #endregion //Methods
+
+ #region Events
+
+ ///
+ /// Occurs when the ChildWindow is closed.
+ ///
+ public event EventHandler Closed;
+ protected virtual void OnClosed(EventArgs e)
+ {
+ if (Closed != null)
+ Closed(this, e);
+ }
+
+ ///
+ /// Occurs when the ChildWindow is closing.
+ ///
+ public event EventHandler Closing;
+ protected virtual void OnClosing(CancelEventArgs e)
+ {
+ if (Closing != null)
+ Closing(this, e);
+ }
+
+ #endregion //Events
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/VisualStates.ChildWindow.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/VisualStates.ChildWindow.cs
new file mode 100644
index 00000000..eb3a4ea9
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/VisualStates.ChildWindow.cs
@@ -0,0 +1,22 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static partial class VisualStates
+ {
+ ///
+ /// Window State group name.
+ ///
+ public const string WindowStatesGroup = "WindowStatesGroup";
+
+ ///
+ /// Open state name for ChildWindow.
+ ///
+ public const string Open = "Open";
+
+ ///
+ /// Closed state name for ChildWindow.
+ ///
+ public const string Closed = "Closed";
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/WindowState.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/WindowState.cs
new file mode 100644
index 00000000..cc001a25
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ChildWindow/WindowState.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Microsoft.Windows.Controls
+{
+ public enum WindowState
+ {
+ Closed,
+ Open
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorPicker.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorPicker.cs
new file mode 100644
index 00000000..0d767f6f
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorPicker.cs
@@ -0,0 +1,395 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Controls.Primitives;
+
+namespace Microsoft.Windows.Controls
+{
+ public class ColorPicker : Control
+ {
+ #region Private Members
+
+ ToggleButton _colorPickerToggleButton;
+ Popup _colorPickerCanvasPopup;
+ Button _okButton;
+ private TranslateTransform _colorShadeSelectorTransform = new TranslateTransform();
+ private Canvas _colorShadingCanvas;
+ private Canvas _colorShadeSelector;
+ private ColorSpectrumSlider _spectrumSlider;
+ private Point? _currentColorPosition;
+ private Color _currentColor = Colors.White;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static ColorPicker()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorPicker), new FrameworkPropertyMetadata(typeof(ColorPicker)));
+ }
+
+ public ColorPicker()
+ {
+
+ }
+
+ #endregion //Constructors
+
+ #region Properties
+
+ public static readonly DependencyProperty CurrentColorProperty = DependencyProperty.Register("CurrentColor", typeof(Color), typeof(ColorPicker), new PropertyMetadata(Colors.White));
+ public Color CurrentColor
+ {
+ get { return (Color)GetValue(CurrentColorProperty); }
+ set { SetValue(CurrentColorProperty, value); }
+ }
+
+ #region SelectedColor
+
+ public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(ColorPicker), new FrameworkPropertyMetadata(Colors.White, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(SelectedColorPropertyChanged)));
+ public Color SelectedColor
+ {
+ get { return (Color)GetValue(SelectedColorProperty); }
+ set { SetValue(SelectedColorProperty, value); }
+ }
+
+ private static void SelectedColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ColorPicker colorPicker = (ColorPicker)d;
+ colorPicker.SetSelectedColor((Color)e.NewValue);
+ }
+
+ #endregion //SelectedColor
+
+ #region ScRGB
+
+ #region ScA
+
+ public static readonly DependencyProperty ScAProperty = DependencyProperty.Register("ScA", typeof(float), typeof(ColorPicker), new PropertyMetadata((float)1, new PropertyChangedCallback(OnScAPropertyChangedChanged)));
+ public float ScA
+ {
+ get { return (float)GetValue(ScAProperty); }
+ set { SetValue(ScAProperty, value); }
+ }
+
+ private static void OnScAPropertyChangedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ColorPicker c = (ColorPicker)d;
+ c.SetScA((float)e.NewValue);
+ }
+
+ protected virtual void SetScA(float newValue)
+ {
+ _currentColor.ScA = newValue;
+ A = _currentColor.A;
+ CurrentColor = _currentColor;
+ HexadecimalString = _currentColor.ToString();
+ }
+
+ #endregion //ScA
+
+ #region ScR
+
+ public static readonly DependencyProperty ScRProperty = DependencyProperty.Register("ScR", typeof(float), typeof(ColorPicker), new PropertyMetadata((float)1, new PropertyChangedCallback(OnScRPropertyChanged)));
+ public float ScR
+ {
+ get { return (float)GetValue(ScRProperty); }
+ set { SetValue(RProperty, value); }
+ }
+
+ private static void OnScRPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //ScR
+
+ #region ScG
+
+ public static readonly DependencyProperty ScGProperty = DependencyProperty.Register("ScG", typeof(float), typeof(ColorPicker), new PropertyMetadata((float)1, new PropertyChangedCallback(OnScGPropertyChanged)));
+ public float ScG
+ {
+ get { return (float)GetValue(ScGProperty); }
+ set { SetValue(GProperty, value); }
+ }
+
+ private static void OnScGPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //ScG
+
+ #region ScB
+
+ public static readonly DependencyProperty ScBProperty = DependencyProperty.Register("ScB", typeof(float), typeof(ColorPicker), new PropertyMetadata((float)1, new PropertyChangedCallback(OnScBPropertyChanged)));
+ public float ScB
+ {
+ get { return (float)GetValue(BProperty); }
+ set { SetValue(BProperty, value); }
+ }
+
+ private static void OnScBPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //ScB
+
+ #endregion //ScRGB
+
+ #region RGB
+
+ #region A
+
+ public static readonly DependencyProperty AProperty = DependencyProperty.Register("A", typeof(byte), typeof(ColorPicker), new PropertyMetadata((byte)255, new PropertyChangedCallback(OnAPropertyChanged)));
+ public byte A
+ {
+ get { return (byte)GetValue(AProperty); }
+ set { SetValue(AProperty, value); }
+ }
+
+ private static void OnAPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ColorPicker c = (ColorPicker)d;
+ c.SetA((byte)e.NewValue);
+ }
+
+ protected virtual void SetA(byte newValue)
+ {
+ _currentColor.A = newValue;
+ SetValue(CurrentColorProperty, _currentColor);
+ }
+
+ #endregion //A
+
+ #region R
+
+ public static readonly DependencyProperty RProperty = DependencyProperty.Register("R", typeof(byte), typeof(ColorPicker), new PropertyMetadata((byte)255, new PropertyChangedCallback(OnRPropertyChanged)));
+ public byte R
+ {
+ get { return (byte)GetValue(RProperty); }
+ set { SetValue(RProperty, value); }
+ }
+
+ private static void OnRPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //R
+
+ #region G
+
+ public static readonly DependencyProperty GProperty = DependencyProperty.Register("G", typeof(byte), typeof(ColorPicker), new PropertyMetadata((byte)255, new PropertyChangedCallback(OnGPropertyChanged)));
+ public byte G
+ {
+ get { return (byte)GetValue(GProperty); }
+ set { SetValue(GProperty, value); }
+ }
+
+ private static void OnGPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //G
+
+ #region B
+
+ public static readonly DependencyProperty BProperty = DependencyProperty.Register("B", typeof(byte), typeof(ColorPicker), new PropertyMetadata((byte)255, new PropertyChangedCallback(OnBPropertyChanged)));
+ public byte B
+ {
+ get { return (byte)GetValue(BProperty); }
+ set { SetValue(BProperty, value); }
+ }
+
+ private static void OnBPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //B
+
+ #endregion //RGB
+
+ #region HexadecimalString
+
+ public static readonly DependencyProperty HexadecimalStringProperty = DependencyProperty.Register("HexadecimalString", typeof(string), typeof(ColorPicker), new PropertyMetadata("#FFFFFFFF", new PropertyChangedCallback(OnHexadecimalStringPropertyChanged)));
+ public string HexadecimalString
+ {
+ get { return (string)GetValue(HexadecimalStringProperty); }
+ set { SetValue(HexadecimalStringProperty, value); }
+ }
+
+ private static void OnHexadecimalStringPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+
+ }
+
+ #endregion //HexadecimalString
+
+ #endregion //Properties
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ _colorPickerToggleButton = (ToggleButton)GetTemplateChild("PART_ColorPickerToggleButton");
+ _colorPickerToggleButton.Click += ColorPickerToggleButton_Clicked;
+
+ _colorPickerCanvasPopup = (Popup)GetTemplateChild("PART_ColorPickerCanvasPopup");
+
+ _colorShadingCanvas = (Canvas)GetTemplateChild("PART_ColorShadingCanvas");
+ _colorShadingCanvas.MouseLeftButtonDown += ColorShadingCanvas_MouseLeftButtonDown;
+ _colorShadingCanvas.MouseMove += ColorShadingCanvas_MouseMove;
+ _colorShadingCanvas.SizeChanged += ColorShadingCanvas_SizeChanged;
+
+ _colorShadeSelector = (Canvas)GetTemplateChild("PART_ColorShadeSelector");
+ _colorShadeSelector.RenderTransform = _colorShadeSelectorTransform;
+
+ _spectrumSlider = (ColorSpectrumSlider)GetTemplateChild("PART_SpectrumSlider");
+ _spectrumSlider.ValueChanged += SpectrumSlider_ValueChanged;
+
+ _okButton = (Button)GetTemplateChild("PART_OkButton");
+ _okButton.Click += OkButton_Click;
+
+ SetSelectedColor(SelectedColor);
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Event Handlers
+
+ void ColorShadingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ Point p = e.GetPosition(_colorShadingCanvas);
+ UpdateColorShadeSelectorPositionAndCalculateColor(p, true);
+ }
+
+ void ColorShadingCanvas_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.LeftButton == MouseButtonState.Pressed)
+ {
+ Point p = e.GetPosition(_colorShadingCanvas);
+ UpdateColorShadeSelectorPositionAndCalculateColor(p, true);
+ Mouse.Synchronize();
+ }
+ }
+
+ void ColorShadingCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
+ {
+ if (_currentColorPosition != null)
+ {
+ Point _newPoint = new Point
+ {
+ X = ((Point)_currentColorPosition).X * e.NewSize.Width,
+ Y = ((Point)_currentColorPosition).Y * e.NewSize.Height
+ };
+
+ UpdateColorShadeSelectorPositionAndCalculateColor(_newPoint, false);
+ }
+ }
+
+ void SpectrumSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
+ {
+ if (_currentColorPosition != null)
+ {
+ CalculateColor((Point)_currentColorPosition);
+ }
+ }
+
+ void OkButton_Click(object sender, RoutedEventArgs e)
+ {
+ if (_colorPickerCanvasPopup.IsOpen || _colorPickerToggleButton.IsChecked == true)
+ {
+ CloseColorPicker();
+ SelectedColor = CurrentColor;
+ }
+ }
+
+ void ColorPickerToggleButton_Clicked(object sender, RoutedEventArgs e)
+ {
+ _colorPickerCanvasPopup.IsOpen = _colorPickerToggleButton.IsChecked ?? false;
+ }
+
+ #endregion //Event Handlers
+
+ #region Methods
+
+ private void CloseColorPicker()
+ {
+ _colorPickerToggleButton.IsChecked = false;
+ _colorPickerCanvasPopup.IsOpen = false;
+ }
+
+ private void SetSelectedColor(Color theColor)
+ {
+ _currentColor = theColor;
+ SetValue(AProperty, _currentColor.A);
+ SetValue(RProperty, _currentColor.R);
+ SetValue(GProperty, _currentColor.G);
+ SetValue(BProperty, _currentColor.B);
+ UpdateColorShadeSelectorPosition(theColor);
+ }
+
+ private void UpdateColorShadeSelectorPositionAndCalculateColor(Point p, bool calculateColor)
+ {
+ if (p.Y < 0)
+ p.Y = 0;
+
+ if (p.X < 0)
+ p.X = 0;
+
+ if (p.X > _colorShadingCanvas.ActualWidth)
+ p.X = _colorShadingCanvas.ActualWidth;
+
+ if (p.Y > _colorShadingCanvas.ActualHeight)
+ p.Y = _colorShadingCanvas.ActualHeight;
+
+ _colorShadeSelectorTransform.X = p.X - (_colorShadeSelector.Width / 2);
+ _colorShadeSelectorTransform.Y = p.Y - (_colorShadeSelector.Height / 2);
+
+ p.X = p.X / _colorShadingCanvas.ActualWidth;
+ p.Y = p.Y / _colorShadingCanvas.ActualHeight;
+
+ _currentColorPosition = p;
+
+ if (calculateColor)
+ CalculateColor(p);
+ }
+
+ private void UpdateColorShadeSelectorPosition(Color color)
+ {
+ if (_spectrumSlider == null || _colorShadingCanvas == null)
+ return;
+
+ _currentColorPosition = null;
+
+ HsvColor hsv = ColorUtilities.ConvertRgbToHsv(color.R, color.G, color.B);
+ _spectrumSlider.Value = hsv.H;
+
+ Point p = new Point(hsv.S, 1 - hsv.V);
+
+ _currentColorPosition = p;
+
+ _colorShadeSelectorTransform.X = (p.X * _colorShadingCanvas.Width) - 5;
+ _colorShadeSelectorTransform.Y = (p.Y * _colorShadingCanvas.Height) - 5;
+ }
+
+ private void CalculateColor(Point p)
+ {
+ HsvColor hsv = new HsvColor(360 - _spectrumSlider.Value, 1, 1) { S = p.X, V = 1 - p.Y };
+ _currentColor = ColorUtilities.ConvertHsvToRgb(hsv.H, hsv.S, hsv.V); ;
+ _currentColor.ScA = ScA;
+ CurrentColor = _currentColor;
+ HexadecimalString = _currentColor.ToString();
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorSpectrumSlider.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorSpectrumSlider.cs
new file mode 100644
index 00000000..c4eac2d8
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorSpectrumSlider.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Shapes;
+
+namespace Microsoft.Windows.Controls
+{
+ internal class ColorSpectrumSlider : Slider
+ {
+ #region Private Members
+
+ private Rectangle _spectrumDisplay;
+ private LinearGradientBrush _pickerBrush;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static ColorSpectrumSlider()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorSpectrumSlider), new FrameworkPropertyMetadata(typeof(ColorSpectrumSlider)));
+ }
+
+ #endregion //Constructors
+
+ #region Dependency Properties
+
+ public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(ColorSpectrumSlider), new PropertyMetadata(System.Windows.Media.Colors.Transparent));
+ public Color SelectedColor
+ {
+ get { return (Color)GetValue(SelectedColorProperty); }
+ set { SetValue(SelectedColorProperty, value); }
+ }
+
+ #endregion //Dependency Properties
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ _spectrumDisplay = (Rectangle)GetTemplateChild("PART_SpectrumDisplay");
+ CreateSpectrum();
+ OnValueChanged(Double.NaN, Value);
+ }
+
+ protected override void OnValueChanged(double oldValue, double newValue)
+ {
+ base.OnValueChanged(oldValue, newValue);
+
+ Color color = ColorUtilities.ConvertHsvToRgb(360 - newValue, 1, 1);
+ SelectedColor = color;
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Methods
+
+ private void CreateSpectrum()
+ {
+ _pickerBrush = new LinearGradientBrush();
+ _pickerBrush.StartPoint = new Point(0.5, 0);
+ _pickerBrush.EndPoint = new Point(0.5, 1);
+ _pickerBrush.ColorInterpolationMode = ColorInterpolationMode.SRgbLinearInterpolation;
+
+ List colorsList = ColorUtilities.GenerateHsvSpectrum();
+
+ double stopIncrement = (double)1 / colorsList.Count;
+
+ int i;
+ for (i = 0; i < colorsList.Count; i++)
+ {
+ _pickerBrush.GradientStops.Add(new GradientStop(colorsList[i], i * stopIncrement));
+ }
+
+ _pickerBrush.GradientStops[i - 1].Offset = 1.0;
+ _spectrumDisplay.Fill = _pickerBrush;
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorUtilities.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorUtilities.cs
new file mode 100644
index 00000000..e621c22b
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/ColorUtilities.cs
@@ -0,0 +1,156 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Media;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static class ColorUtilities
+ {
+ ///
+ /// Converts an RGB color to an HSV color.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static HsvColor ConvertRgbToHsv(int r, int b, int g)
+ {
+ double delta, min;
+ double h = 0, s, v;
+
+ min = Math.Min(Math.Min(r, g), b);
+ v = Math.Max(Math.Max(r, g), b);
+ delta = v - min;
+
+ if (v == 0.0)
+ {
+ s = 0;
+ }
+ else
+ s = delta / v;
+
+ if (s == 0)
+ h = 0.0;
+
+ else
+ {
+ if (r == v)
+ h = (g - b) / delta;
+ else if (g == v)
+ h = 2 + (b - r) / delta;
+ else if (b == v)
+ h = 4 + (r - g) / delta;
+
+ h *= 60;
+ if (h < 0.0)
+ h = h + 360;
+
+ }
+
+ return new HsvColor { H = h, S = s, V = v / 255 };
+ }
+
+ ///
+ /// Converts an HSV color to an RGB color.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static Color ConvertHsvToRgb(double h, double s, double v)
+ {
+ double r = 0, g = 0, b = 0;
+
+ if (s == 0)
+ {
+ r = v;
+ g = v;
+ b = v;
+ }
+ else
+ {
+ int i;
+ double f, p, q, t;
+
+ if (h == 360)
+ h = 0;
+ else
+ h = h / 60;
+
+ i = (int)Math.Truncate(h);
+ f = h - i;
+
+ p = v * (1.0 - s);
+ q = v * (1.0 - (s * f));
+ t = v * (1.0 - (s * (1.0 - f)));
+
+ switch (i)
+ {
+ case 0:
+ {
+ r = v;
+ g = t;
+ b = p;
+ break;
+ }
+ case 1:
+ {
+ r = q;
+ g = v;
+ b = p;
+ break;
+ }
+ case 2:
+ {
+ r = p;
+ g = v;
+ b = t;
+ break;
+ }
+ case 3:
+ {
+ r = p;
+ g = q;
+ b = v;
+ break;
+ }
+ case 4:
+ {
+ r = t;
+ g = p;
+ b = v;
+ break;
+ }
+ default:
+ {
+ r = v;
+ g = p;
+ b = q;
+ break;
+ }
+ }
+
+ }
+
+ return Color.FromArgb(255, (byte)(r * 255), (byte)(g * 255), (byte)(b * 255));
+ }
+
+ ///
+ /// Generates a list of colors with hues ranging from 0 360 and a saturation and value of 1.
+ ///
+ ///
+ public static List GenerateHsvSpectrum()
+ {
+ List colorsList = new List(8);
+
+ for (int i = 0; i < 29; i++)
+ {
+ colorsList.Add(ColorUtilities.ConvertHsvToRgb(i * 12, 1, 1));
+ }
+
+ colorsList.Add(ColorUtilities.ConvertHsvToRgb(0, 1, 1));
+
+ return colorsList;
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/HsvColor.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/HsvColor.cs
new file mode 100644
index 00000000..eed5c3bd
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/ColorPicker/HsvColor.cs
@@ -0,0 +1,18 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal struct HsvColor
+ {
+ public double H;
+ public double S;
+ public double V;
+
+ public HsvColor(double h, double s, double v)
+ {
+ H = h;
+ S = s;
+ V = v;
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs
new file mode 100644
index 00000000..263ca034
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Core/UIElementAdorner.cs
@@ -0,0 +1,215 @@
+using System;
+using System.Collections;
+using System.Windows.Media;
+using System.Windows.Documents;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls.Core
+{
+ ///
+ /// An adorner that can display one and only one UIElement.
+ /// That element can be a panel, which contains multiple other elements.
+ /// The element is added to the adorner's visual and logical trees, enabling it to
+ /// particpate in dependency property value inheritance, amongst other things.
+ ///
+ internal class UIElementAdorner
+ : Adorner
+ where TElement : UIElement
+ {
+ #region Fields
+
+ TElement _child = null;
+ double _offsetLeft = 0;
+ double _offsetTop = 0;
+
+ #endregion // Fields
+
+ #region Constructor
+
+ ///
+ /// Constructor.
+ ///
+ /// The element to which the adorner will be bound.
+ public UIElementAdorner(UIElement adornedElement)
+ : base(adornedElement)
+ {
+ }
+
+ #endregion // Constructor
+
+ #region Public Interface
+
+ #region Child
+
+ ///
+ /// Gets/sets the child element hosted in the adorner.
+ ///
+ public TElement Child
+ {
+ get { return _child; }
+ set
+ {
+ if (value == _child)
+ return;
+
+ if (_child != null)
+ {
+ base.RemoveLogicalChild(_child);
+ base.RemoveVisualChild(_child);
+ }
+
+ _child = value;
+
+ if (_child != null)
+ {
+ base.AddLogicalChild(_child);
+ base.AddVisualChild(_child);
+ }
+ }
+ }
+
+ #endregion // Child
+
+ #region GetDesiredTransform
+
+ ///
+ /// Override.
+ ///
+ ///
+ ///
+ public override GeneralTransform GetDesiredTransform(GeneralTransform transform)
+ {
+ GeneralTransformGroup result = new GeneralTransformGroup();
+ result.Children.Add(base.GetDesiredTransform(transform));
+ result.Children.Add(new TranslateTransform(_offsetLeft, _offsetTop));
+ return result;
+ }
+
+ #endregion // GetDesiredTransform
+
+ #region OffsetLeft
+
+ ///
+ /// Gets/sets the horizontal offset of the adorner.
+ ///
+ public double OffsetLeft
+ {
+ get { return _offsetLeft; }
+ set
+ {
+ _offsetLeft = value;
+ UpdateLocation();
+ }
+ }
+
+ #endregion // OffsetLeft
+
+ #region SetOffsets
+
+ ///
+ /// Updates the location of the adorner in one atomic operation.
+ ///
+ public void SetOffsets(double left, double top)
+ {
+ _offsetLeft = left;
+ _offsetTop = top;
+ this.UpdateLocation();
+ }
+
+ #endregion // SetOffsets
+
+ #region OffsetTop
+
+ ///
+ /// Gets/sets the vertical offset of the adorner.
+ ///
+ public double OffsetTop
+ {
+ get { return _offsetTop; }
+ set
+ {
+ _offsetTop = value;
+ UpdateLocation();
+ }
+ }
+
+ #endregion // OffsetTop
+
+ #endregion // Public Interface
+
+ #region Protected Overrides
+
+ ///
+ /// Override.
+ ///
+ ///
+ ///
+ protected override Size MeasureOverride(Size constraint)
+ {
+ if (_child == null)
+ return base.MeasureOverride(constraint);
+
+ _child.Measure(constraint);
+ return _child.DesiredSize;
+ }
+
+ ///
+ /// Override.
+ ///
+ ///
+ ///
+ protected override Size ArrangeOverride(Size finalSize)
+ {
+ if (_child == null)
+ return base.ArrangeOverride(finalSize);
+
+ _child.Arrange(new Rect(finalSize));
+ return finalSize;
+ }
+
+ ///
+ /// Override.
+ ///
+ protected override IEnumerator LogicalChildren
+ {
+ get
+ {
+ ArrayList list = new ArrayList();
+ if (_child != null)
+ list.Add(_child);
+ return list.GetEnumerator();
+ }
+ }
+
+ ///
+ /// Override.
+ ///
+ ///
+ ///
+ protected override Visual GetVisualChild(int index)
+ {
+ return _child;
+ }
+
+ ///
+ /// Override.
+ ///
+ protected override int VisualChildrenCount
+ {
+ get { return _child == null ? 0 : 1; }
+ }
+
+ #endregion // Protected Overrides
+
+ #region Private Helpers
+
+ void UpdateLocation()
+ {
+ AdornerLayer adornerLayer = base.Parent as AdornerLayer;
+ if (adornerLayer != null)
+ adornerLayer.Update(base.AdornedElement);
+ }
+
+ #endregion // Private Helpers
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Error48.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Error48.png
new file mode 100644
index 00000000..4304d43b
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Error48.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Information48.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Information48.png
new file mode 100644
index 00000000..35075187
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Information48.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Question48.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Question48.png
new file mode 100644
index 00000000..dad7dd09
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Question48.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Warning48.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Warning48.png
new file mode 100644
index 00000000..ecb7fe86
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/Icons/Warning48.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/MessageBox.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/MessageBox.cs
new file mode 100644
index 00000000..317dd405
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/MessageBox.cs
@@ -0,0 +1,419 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Controls.Primitives;
+
+namespace Microsoft.Windows.Controls
+{
+ [TemplateVisualState(Name = VisualStates.OK, GroupName = VisualStates.MessageBoxButtonsGroup)]
+ [TemplateVisualState(Name = VisualStates.OKCancel, GroupName = VisualStates.MessageBoxButtonsGroup)]
+ [TemplateVisualState(Name = VisualStates.YesNo, GroupName = VisualStates.MessageBoxButtonsGroup)]
+ [TemplateVisualState(Name = VisualStates.YesNoCancel, GroupName = VisualStates.MessageBoxButtonsGroup)]
+ public class MessageBox : Control
+ {
+ #region Private Members
+
+ ///
+ /// Tracks the MessageBoxButon value passed into the InitializeContainer method
+ ///
+ private MessageBoxButton _button = MessageBoxButton.OK;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ static MessageBox()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(MessageBox), new FrameworkPropertyMetadata(typeof(MessageBox)));
+ }
+
+ internal MessageBox()
+ { /*user cannot create instance */ }
+
+ #endregion //Constructors
+
+ #region Properties
+
+ #region Protected Properties
+
+ ///
+ /// A System.Windows.MessageBoxResult value that specifies which message box button was clicked by the user.
+ ///
+ protected MessageBoxResult MessageBoxResult = MessageBoxResult.None;
+
+ protected Window Container { get; private set; }
+ protected Thumb DragWidget { get; private set; }
+ protected Button CloseButton { get; private set; }
+
+ protected Button OkButton { get; private set; }
+ protected Button CancelButton { get; private set; }
+ protected Button YesButton { get; private set; }
+ protected Button NoButton { get; private set; }
+
+ protected Button OkButton1 { get; private set; }
+ protected Button CancelButton1 { get; private set; }
+ protected Button YesButton1 { get; private set; }
+ protected Button NoButton1 { get; private set; }
+
+ #endregion //Protected Properties
+
+ #region Dependency Properties
+
+ public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(MessageBox), new UIPropertyMetadata(String.Empty));
+ public string Caption
+ {
+ get { return (string)GetValue(CaptionProperty); }
+ set { SetValue(CaptionProperty, value); }
+ }
+
+ public static readonly DependencyProperty CaptionForegroundProperty = DependencyProperty.Register("CaptionForeground", typeof(Brush), typeof(MessageBox), new UIPropertyMetadata(null));
+ public Brush CaptionForeground
+ {
+ get { return (Brush)GetValue(CaptionForegroundProperty); }
+ set { SetValue(CaptionForegroundProperty, value); }
+ }
+
+ public static readonly DependencyProperty CloseButtonStyleProperty = DependencyProperty.Register("CloseButtonStyle", typeof(Style), typeof(MessageBox), new PropertyMetadata(null));
+ public Style CloseButtonStyle
+ {
+ get { return (Style)GetValue(CloseButtonStyleProperty); }
+ set { SetValue(CloseButtonStyleProperty, value); }
+ }
+
+ public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(MessageBox), new UIPropertyMetadata(default(ImageSource)));
+ public ImageSource ImageSource
+ {
+ get { return (ImageSource)GetValue(ImageSourceProperty); }
+ set { SetValue(ImageSourceProperty, value); }
+ }
+
+ public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MessageBox), new UIPropertyMetadata(String.Empty));
+ public string Text
+ {
+ get { return (string)GetValue(TextProperty); }
+ set { SetValue(TextProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowBackgroundProperty = DependencyProperty.Register("WindowBackground", typeof(Brush), typeof(MessageBox), new PropertyMetadata(null));
+ public Brush WindowBackground
+ {
+ get { return (Brush)GetValue(WindowBackgroundProperty); }
+ set { SetValue(WindowBackgroundProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowBorderBrushProperty = DependencyProperty.Register("WindowBorderBrush", typeof(Brush), typeof(MessageBox), new PropertyMetadata(null));
+ public Brush WindowBorderBrush
+ {
+ get { return (Brush)GetValue(WindowBorderBrushProperty); }
+ set { SetValue(WindowBorderBrushProperty, value); }
+ }
+
+ public static readonly DependencyProperty WindowOpacityProperty = DependencyProperty.Register("WindowOpacity", typeof(double), typeof(MessageBox), new PropertyMetadata(null));
+ public double WindowOpacity
+ {
+ get { return (double)GetValue(WindowOpacityProperty); }
+ set { SetValue(WindowOpacityProperty, value); }
+ }
+
+ #endregion //Dependency Properties
+
+ #endregion //Properties
+
+ #region Base Class Overrides
+
+ ///
+ /// Overrides the OnApplyTemplate method.
+ ///
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ DragWidget = (Thumb)GetTemplateChild("PART_DragWidget");
+ if (DragWidget != null)
+ DragWidget.DragDelta += (o, e) => ProcessMove(e);
+
+ CloseButton = (Button)GetTemplateChild("PART_CloseButton");
+ if (CloseButton != null)
+ CloseButton.Click += (o, e) => Close();
+
+ NoButton = (Button)GetTemplateChild("PART_NoButton");
+ if (NoButton != null)
+ NoButton.Click += (o, e) => Button_Click(o, e);
+
+ NoButton1 = (Button)GetTemplateChild("PART_NoButton1");
+ if (NoButton1 != null)
+ NoButton1.Click += (o, e) => Button_Click(o, e);
+
+ YesButton = (Button)GetTemplateChild("PART_YesButton");
+ if (YesButton != null)
+ YesButton.Click += (o, e) => Button_Click(o, e);
+
+ YesButton1 = (Button)GetTemplateChild("PART_YesButton1");
+ if (YesButton1 != null)
+ YesButton1.Click += (o, e) => Button_Click(o, e);
+
+ CancelButton = (Button)GetTemplateChild("PART_CancelButton");
+ if (CancelButton != null)
+ CancelButton.Click += (o, e) => Button_Click(o, e);
+
+ CancelButton1 = (Button)GetTemplateChild("PART_CancelButton1");
+ if (CancelButton1 != null)
+ CancelButton1.Click += (o, e) => Button_Click(o, e);
+
+ OkButton = (Button)GetTemplateChild("PART_OkButton");
+ if (OkButton != null)
+ OkButton.Click += (o, e) => Button_Click(o, e);
+
+ OkButton1 = (Button)GetTemplateChild("PART_OkButton1");
+ if (OkButton1 != null)
+ OkButton1.Click += (o, e) => Button_Click(o, e);
+
+ ChangeVisualState(_button.ToString(), true);
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Methods
+
+ #region Public Static
+
+ ///
+ /// Displays a message box that has a message and that returns a result.
+ ///
+ /// A System.String that specifies the text to display.
+ /// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
+ public static MessageBoxResult Show(string messageText)
+ {
+ return Show(messageText, string.Empty, MessageBoxButton.OK);
+ }
+
+ ///
+ /// Displays a message box that has a message and title bar caption; and that returns a result.
+ ///
+ /// A System.String that specifies the text to display.
+ /// A System.String that specifies the title bar caption to display.
+ /// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
+ public static MessageBoxResult Show(string messageText, string caption)
+ {
+ return Show(messageText, caption, MessageBoxButton.OK);
+ }
+
+ ///
+ /// Displays a message box that has a message and that returns a result.
+ ///
+ /// A System.String that specifies the text to display.
+ /// A System.String that specifies the title bar caption to display.
+ /// A System.Windows.MessageBoxButton value that specifies which button or buttons to display.
+ /// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
+ public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button)
+ {
+ return ShowCore(messageText, caption, button, MessageBoxImage.None);
+ }
+
+ ///
+ /// Displays a message box that has a message and that returns a result.
+ ///
+ /// A System.String that specifies the text to display.
+ /// A System.String that specifies the title bar caption to display.
+ /// A System.Windows.MessageBoxButton value that specifies which button or buttons to display.
+ /// A System.Windows.MessageBoxImage value that specifies the icon to display.
+ /// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
+ public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon)
+ {
+ return ShowCore(messageText, caption, button, icon);
+ }
+
+ #endregion //Public Static
+
+ #region Private Static
+
+ private static MessageBoxResult ShowCore(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon)
+ {
+ MessageBox msgBox = new MessageBox();
+ msgBox.InitializeMessageBox(messageText, caption, button, icon);
+ msgBox.Show();
+ return msgBox.MessageBoxResult;
+ }
+
+ ///
+ /// Resolves the owner Window of the MessageBox.
+ ///
+ ///
+ private static FrameworkElement ResolveOwner()
+ {
+ FrameworkElement owner = null;
+ if (Application.Current != null)
+ {
+ foreach (Window w in Application.Current.Windows)
+ {
+ if (w.IsActive)
+ {
+ owner = w;
+ break;
+ }
+ }
+ }
+ return owner;
+ }
+
+ #endregion //Private Static
+
+ #region Protected
+
+ ///
+ /// Shows the MessageBox
+ ///
+ protected void Show()
+ {
+ Container.ShowDialog();
+ }
+
+ ///
+ /// Initializes the MessageBox.
+ ///
+ /// The text.
+ /// The caption.
+ /// The button.
+ /// The image.
+ protected void InitializeMessageBox(string text, string caption, MessageBoxButton button, MessageBoxImage image)
+ {
+ Text = text;
+ Caption = caption;
+ _button = button;
+ SetImageSource(image);
+ Container = CreateContainer();
+ }
+
+ ///
+ /// Changes the control's visual state(s).
+ ///
+ /// name of the state
+ /// True if state transitions should be used.
+ protected void ChangeVisualState(string name, bool useTransitions)
+ {
+ VisualStateManager.GoToState(this, name, useTransitions);
+ }
+
+ #endregion //Protected
+
+ #region Private
+
+ ///
+ /// Sets the message image source.
+ ///
+ /// The image to show.
+ private void SetImageSource(MessageBoxImage image)
+ {
+ String iconName = String.Empty;
+
+ switch (image)
+ {
+ case MessageBoxImage.Error:
+ {
+ iconName = "Error48.png";
+ break;
+ }
+ case MessageBoxImage.Information:
+ {
+ iconName = "Information48.png";
+ break;
+ }
+ case MessageBoxImage.Question:
+ {
+ iconName = "Question48.png";
+ break;
+ }
+ case MessageBoxImage.Warning:
+ {
+ iconName = "Warning48.png";
+ break;
+ }
+ case MessageBoxImage.None:
+ default:
+ {
+ return;
+ }
+ }
+
+ ImageSource = (ImageSource)new ImageSourceConverter().ConvertFromString(String.Format("pack://application:,,,/WPFToolkit.Extended;component/MessageBox/Icons/{0}", iconName));
+ }
+
+ ///
+ /// Creates the container which will host the MessageBox control.
+ ///
+ ///
+ private Window CreateContainer()
+ {
+ return new Window()
+ {
+ AllowsTransparency = true,
+ Background = Brushes.Transparent,
+ Content = this,
+ Owner = Window.GetWindow(ResolveOwner()),
+ ShowInTaskbar = false,
+ SizeToContent = System.Windows.SizeToContent.WidthAndHeight,
+ ResizeMode = System.Windows.ResizeMode.NoResize,
+ WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner,
+ WindowStyle = System.Windows.WindowStyle.None
+ };
+ }
+
+ #endregion //Private
+
+ #endregion //Methods
+
+ #region Event Handlers
+
+ ///
+ /// Processes the move of a drag operation on the header.
+ ///
+ /// The instance containing the event data.
+ private void ProcessMove(DragDeltaEventArgs e)
+ {
+ Container.Left = Container.Left + e.HorizontalChange;
+ Container.Top = Container.Top + e.VerticalChange;
+ }
+
+ ///
+ /// Sets the MessageBoxResult according to the button pressed and then closes the MessageBox.
+ ///
+ /// The source of the event.
+ /// The instance containing the event data.
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ Button button = e.Source as Button;
+ switch (button.Name)
+ {
+ case "PART_NoButton":
+ case "PART_NoButton1":
+ MessageBoxResult = MessageBoxResult.No;
+ break;
+ case "PART_YesButton":
+ case "PART_YesButton1":
+ MessageBoxResult = MessageBoxResult.Yes;
+ break;
+ case "PART_CancelButton":
+ case "PART_CancelButton1":
+ MessageBoxResult = MessageBoxResult.Cancel;
+ break;
+ case "PART_OkButton":
+ case "PART_OkButton1":
+ MessageBoxResult = MessageBoxResult.OK;
+ break;
+ }
+
+ Close();
+ }
+
+ ///
+ /// Closes the MessageBox.
+ ///
+ private void Close()
+ {
+ Container.Close();
+ }
+
+ #endregion //Event Handlers
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/VisualStates.MessageBox.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/VisualStates.MessageBox.cs
new file mode 100644
index 00000000..d47fcb08
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/MessageBox/VisualStates.MessageBox.cs
@@ -0,0 +1,17 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static partial class VisualStates
+ {
+ public const string MessageBoxButtonsGroup = "MessageBoxButtonsGroup";
+
+ public const string OK = "OK";
+
+ public const string OKCancel = "OKCancel";
+
+ public const string YesNo = "YesNo";
+
+ public const string YesNoCancel = "YesNoCancel";
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/NumericUpDown/NumericUpDown.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/NumericUpDown/NumericUpDown.cs
new file mode 100644
index 00000000..b2b9dd9f
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/NumericUpDown/NumericUpDown.cs
@@ -0,0 +1,187 @@
+using System;
+using System.Windows;
+using System.Globalization;
+
+namespace Microsoft.Windows.Controls
+{
+
+ public class NumericUpDown : UpDownBase
+ {
+ #region Properties
+
+ #region Minimum
+
+ public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(Double.MinValue, OnMinimumPropertyChanged));
+ public double Minimum
+ {
+ get { return (double)GetValue(MinimumProperty); }
+ set { SetValue(MinimumProperty, value); }
+ }
+
+ private static void OnMinimumPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ }
+
+ protected virtual void OnMinimumChanged(double oldValue, double newValue)
+ {
+ }
+ #endregion Minimum
+
+ #region Maximum
+
+ public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(Double.MaxValue, OnMaximumPropertyChanged));
+ public double Maximum
+ {
+ get { return (double)GetValue(MaximumProperty); }
+ set { SetValue(MaximumProperty, value); }
+ }
+
+ private static void OnMaximumPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ }
+
+ protected virtual void OnMaximumChanged(double oldValue, double newValue)
+ {
+ }
+ #endregion Maximum
+
+ #region Increment
+
+ public static readonly DependencyProperty IncrementProperty = DependencyProperty.Register("Increment", typeof(double), typeof(NumericUpDown), new PropertyMetadata(1d, OnIncrementPropertyChanged));
+ public double Increment
+ {
+ get { return (double)GetValue(IncrementProperty); }
+ set { SetValue(IncrementProperty, value); }
+ }
+
+ private static void OnIncrementPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ }
+
+ protected virtual void OnIncrementChanged(double oldValue, double newValue)
+ {
+ }
+
+ #endregion
+
+ #region FormatString
+
+ public static readonly DependencyProperty StringFormatProperty = DependencyProperty.Register("FormatString", typeof(string), typeof(NumericUpDown), new PropertyMetadata("F0", OnStringFormatPropertyPropertyChanged));
+ public string FormatString
+ {
+ get { return (string)GetValue(StringFormatProperty); }
+ set { SetValue(StringFormatProperty, value); }
+ }
+
+ private static void OnStringFormatPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ NumericUpDown nud = d as NumericUpDown;
+ nud.OnStringFormatChanged(e.OldValue.ToString(), e.NewValue.ToString());
+ }
+
+ protected virtual void OnStringFormatChanged(string oldValue, string newValue)
+ {
+ Text = FormatValue();
+ }
+
+ #endregion //FormatString
+
+ #endregion
+
+ #region Constructors
+
+ public NumericUpDown()
+ : base()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), new FrameworkPropertyMetadata(typeof(NumericUpDown)));
+ }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+ SetValidSpinDirection();
+ }
+
+ protected override void OnValueChanged(RoutedPropertyChangedEventArgs e)
+ {
+ SetValidSpinDirection();
+ }
+
+ protected override double ParseValue(string text)
+ {
+ NumberFormatInfo info = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture);
+ if (text.Contains(info.PercentSymbol))
+ return TryParcePercent(text, info);
+ else
+ return TryParceDouble(text, info);
+ }
+
+ protected internal override string FormatValue()
+ {
+ return Value.ToString(FormatString, CultureInfo.CurrentCulture);
+ }
+
+ protected override void OnIncrement()
+ {
+ Value = (double)((decimal)Value + (decimal)Increment);
+ }
+
+ protected override void OnDecrement()
+ {
+ Value = (double)((decimal)Value - (decimal)Increment);
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Methods
+
+ ///
+ /// Sets the valid spin direction based on current value, minimum and maximum.
+ ///
+ private void SetValidSpinDirection()
+ {
+ ValidSpinDirections validDirections = ValidSpinDirections.None;
+
+ if (Value < Maximum)
+ {
+ validDirections = validDirections | ValidSpinDirections.Increase;
+ }
+
+ if (Value > Minimum)
+ {
+ validDirections = validDirections | ValidSpinDirections.Decrease;
+ }
+
+ if (Spinner != null)
+ {
+ Spinner.ValidSpinDirection = validDirections;
+ }
+ }
+
+ private double TryParcePercent(string text, NumberFormatInfo info)
+ {
+ double result;
+ text = text.Replace(info.PercentSymbol, null);
+ result = TryParceDouble(text, info);
+ return result / 100;
+ }
+
+ private double TryParceDouble(string text, NumberFormatInfo info)
+ {
+ double result;
+ if (!double.TryParse(text, NumberStyles.Any, info, out result))
+ {
+ //an error occured now lets reset our value, text, and the text in the textbox
+ result = Value;
+ TextBox.Text = Text = FormatValue();
+ }
+ return result;
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/AssemblyInfo.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..0903bf68
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Extended WPF Toolkit")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Extended WPF Toolkit")]
+[assembly: AssemblyCopyright("Copyright © 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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.2.0.0")]
+[assembly: AssemblyFileVersion("1.2.0.0")]
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Resources.Designer.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..eaf63633
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Microsoft.Windows.Controls.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Windows.Controls.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Resources.resx b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Resources.resx
new file mode 100644
index 00000000..ffecec85
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Settings.Designer.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..4a0f1423
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Microsoft.Windows.Controls.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Settings.settings b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Settings.settings
new file mode 100644
index 00000000..8f2fd95d
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/ITextFormatter.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/ITextFormatter.cs
new file mode 100644
index 00000000..f8e22d41
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/ITextFormatter.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Windows.Documents;
+
+namespace Microsoft.Windows.Controls
+{
+ public interface ITextFormatter
+ {
+ string GetText(FlowDocument document);
+ void SetText(FlowDocument document, string text);
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/PlainTextFormatter.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/PlainTextFormatter.cs
new file mode 100644
index 00000000..1c792a32
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/PlainTextFormatter.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Windows.Documents;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Formats the RichTextBox text as plain text
+ ///
+ public class PlainTextFormatter : ITextFormatter
+ {
+ public string GetText(FlowDocument document)
+ {
+ return new TextRange(document.ContentStart, document.ContentEnd).Text;
+ }
+
+ public void SetText(FlowDocument document, string text)
+ {
+ new TextRange(document.ContentStart, document.ContentEnd).Text = text;
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/RtfFormatter.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/RtfFormatter.cs
new file mode 100644
index 00000000..e5a1def6
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/RtfFormatter.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Text;
+using System.Windows.Documents;
+using System.IO;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Formats the RichTextBox text as RTF
+ ///
+ public class RtfFormatter : ITextFormatter
+ {
+ public string GetText(FlowDocument document)
+ {
+ TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
+ using (MemoryStream ms = new MemoryStream())
+ {
+ tr.Save(ms, DataFormats.Rtf);
+ return ASCIIEncoding.Default.GetString(ms.ToArray());
+ }
+ }
+
+ public void SetText(FlowDocument document, string text)
+ {
+ TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
+ using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(text)))
+ {
+ tr.Load(ms, DataFormats.Rtf);
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/XamlFormatter.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/XamlFormatter.cs
new file mode 100644
index 00000000..07e1d31a
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/Formatters/XamlFormatter.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Text;
+using System.IO;
+using System.Windows.Documents;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Formats the RichTextBox text as Xaml
+ ///
+ public class XamlFormatter : ITextFormatter
+ {
+ public string GetText(System.Windows.Documents.FlowDocument document)
+ {
+ TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
+ using (MemoryStream ms = new MemoryStream())
+ {
+ tr.Save(ms, DataFormats.Xaml);
+ return ASCIIEncoding.Default.GetString(ms.ToArray());
+ }
+ }
+
+ public void SetText(System.Windows.Documents.FlowDocument document, string text)
+ {
+ try
+ {
+ TextRange tr = new TextRange(document.ContentStart, document.ContentEnd);
+ using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(text)))
+ {
+ tr.Load(ms, DataFormats.Xaml);
+ }
+ }
+ catch
+ {
+ throw new InvalidDataException("data provided is not in the correct Xaml format.");
+ }
+ }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs
new file mode 100644
index 00000000..ab1c805a
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBox/RichTextBox.cs
@@ -0,0 +1,135 @@
+using System;
+using System.Windows;
+using System.Windows.Data;
+using System.Windows.Threading;
+
+namespace Microsoft.Windows.Controls
+{
+ public class RichTextBox : System.Windows.Controls.RichTextBox
+ {
+ #region Private Members
+
+ private bool _textHasLoaded;
+ private bool isInvokePending;
+
+ #endregion //Private Members
+
+ #region Constructors
+
+ public RichTextBox()
+ {
+ Loaded += RichTextBox_Loaded;
+ }
+
+ public RichTextBox(System.Windows.Documents.FlowDocument document)
+ : base(document)
+ {
+
+ }
+
+ #endregion //Constructors
+
+ #region Properties
+
+ #region Text
+
+ public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(RichTextBox), new FrameworkPropertyMetadata(String.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextPropertyChanged, CoerceTextProperty, true, UpdateSourceTrigger.LostFocus));
+ public string Text
+ {
+ get { return (string)GetValue(TextProperty); }
+ set { SetValue(TextProperty, value); }
+ }
+
+ private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ RichTextBox rtb = (RichTextBox)d;
+
+ if (!rtb._textHasLoaded)
+ {
+ rtb.TextFormatter.SetText(rtb.Document, (string)e.NewValue);
+ rtb._textHasLoaded = true;
+ }
+ }
+
+ private static object CoerceTextProperty(DependencyObject d, object value)
+ {
+ return value ?? "";
+ }
+
+ #endregion //Text
+
+ #region TextFormatter
+
+ private ITextFormatter _textFormatter;
+ ///
+ /// The ITextFormatter the is used to format the text of the RichTextBox.
+ /// Deafult formatter is the RtfFormatter
+ ///
+ public ITextFormatter TextFormatter
+ {
+ get
+ {
+ if (_textFormatter == null)
+ _textFormatter = new RtfFormatter(); //default is rtf
+
+ return _textFormatter;
+ }
+ set
+ {
+ _textFormatter = value;
+ }
+ }
+
+ #endregion //TextFormatter
+
+ #endregion //Properties
+
+ #region Methods
+
+ private void InvokeUpdateText()
+ {
+ if (!isInvokePending)
+ {
+ Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(UpdateText));
+ isInvokePending = true;
+ }
+ }
+
+ private void UpdateText()
+ {
+ //when the Text is null and the Text hasn't been loaded, it indicates that the OnTextPropertyChanged event hasn't exceuted
+ //and since we are initializing the text from here, we don't want the OnTextPropertyChanged to execute, so set the loaded flag to true.
+ //this prevents the cursor to jumping to the front of the textbox after the first letter is typed.
+ if (!_textHasLoaded && string.IsNullOrEmpty(Text))
+ _textHasLoaded = true;
+
+ if (_textHasLoaded)
+ Text = TextFormatter.GetText(Document);
+
+ isInvokePending = false;
+ }
+
+ #endregion //Methods
+
+ #region Event Hanlders
+
+ private void RichTextBox_Loaded(object sender, RoutedEventArgs e)
+ {
+ Binding binding = BindingOperations.GetBinding(this, TextProperty);
+
+ if (binding != null)
+ {
+ if (binding.UpdateSourceTrigger == UpdateSourceTrigger.Default || binding.UpdateSourceTrigger == UpdateSourceTrigger.LostFocus)
+ {
+ PreviewLostKeyboardFocus += (o, ea) => UpdateText(); //do this synchronously
+ }
+ else
+ {
+ TextChanged += (o, ea) => InvokeUpdateText(); //do this async
+ }
+ }
+ }
+
+ #endregion //Event Hanlders
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs
new file mode 100644
index 00000000..46c38afe
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/IRichTextBoxFormatBar.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ public interface IRichTextBoxFormatBar
+ {
+ ///
+ /// Represents the RichTextBox that will be the target for all text manipulations in the format bar.
+ ///
+ global::System.Windows.Controls.RichTextBox Target { get; set; }
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Bold16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Bold16.png
new file mode 100644
index 00000000..8fb36a1a
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Bold16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/CenterAlign16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/CenterAlign16.png
new file mode 100644
index 00000000..1030a021
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/CenterAlign16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Italic16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Italic16.png
new file mode 100644
index 00000000..8259a9e1
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Italic16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/JustifyAlign16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/JustifyAlign16.png
new file mode 100644
index 00000000..c5499bce
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/JustifyAlign16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/LeftAlign16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/LeftAlign16.png
new file mode 100644
index 00000000..51dffb73
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/LeftAlign16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/RightAlign16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/RightAlign16.png
new file mode 100644
index 00000000..cb8e400a
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/RightAlign16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Underline16.png b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Underline16.png
new file mode 100644
index 00000000..72689482
Binary files /dev/null and b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/Images/Underline16.png differ
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml
new file mode 100644
index 00000000..6d919c41
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml.cs
new file mode 100644
index 00000000..65e78914
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBar.xaml.cs
@@ -0,0 +1,162 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Media;
+using System.Windows.Controls.Primitives;
+using Microsoft.Windows.Controls.Core;
+
+namespace Microsoft.Windows.Controls
+{
+ ///
+ /// Interaction logic for RichTextBoxFormatBar.xaml
+ ///
+ public partial class RichTextBoxFormatBar : UserControl, IRichTextBoxFormatBar
+ {
+ #region Properties
+
+ #region RichTextBox
+
+ public static readonly DependencyProperty TargetProperty = DependencyProperty.Register("Target", typeof(global::System.Windows.Controls.RichTextBox), typeof(RichTextBoxFormatBar), new PropertyMetadata(null, OnRichTextBoxPropertyChanged));
+ public global::System.Windows.Controls.RichTextBox Target
+ {
+ get { return (global::System.Windows.Controls.RichTextBox)GetValue(TargetProperty); }
+ set { SetValue(TargetProperty, value); }
+ }
+
+ private static void OnRichTextBoxPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ RichTextBoxFormatBar formatBar = d as RichTextBoxFormatBar;
+ formatBar.HookupRichTextBoxEvents();
+ }
+
+ private void HookupRichTextBoxEvents()
+ {
+ Target.SelectionChanged += RichTextBox_SelectionChanged;
+ }
+
+ #endregion //RichTextBox
+
+ public static double[] FontSizes
+ {
+ get
+ {
+ return new double[] {
+ 3.0, 4.0, 5.0, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5,
+ 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 15.0,
+ 16.0, 17.0, 18.0, 19.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0,
+ 32.0, 34.0, 36.0, 38.0, 40.0, 44.0, 48.0, 52.0, 56.0, 60.0, 64.0, 68.0, 72.0, 76.0,
+ 80.0, 88.0, 96.0, 104.0, 112.0, 120.0, 128.0, 136.0, 144.0
+ };
+ }
+ }
+
+ #endregion
+
+ #region Constructors
+
+ public RichTextBoxFormatBar()
+ {
+ InitializeComponent();
+ Loaded += FormatToolbar_Loaded;
+ }
+
+ #endregion //Constructors
+
+ #region Event Hanlders
+
+ void FormatToolbar_Loaded(object sender, RoutedEventArgs e)
+ {
+ _cmbFontFamilies.ItemsSource = Fonts.SystemFontFamilies;
+ _cmbFontSizes.ItemsSource = FontSizes;
+ }
+
+ private void FontFamily_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (e.AddedItems.Count == 0)
+ return;
+
+ FontFamily editValue = (FontFamily)e.AddedItems[0];
+ ApplyPropertyValueToSelectedText(TextElement.FontFamilyProperty, editValue);
+ }
+
+ private void FontSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (e.AddedItems.Count == 0)
+ return;
+
+ ApplyPropertyValueToSelectedText(TextElement.FontSizeProperty, e.AddedItems[0]);
+ }
+
+ void RichTextBox_SelectionChanged(object sender, RoutedEventArgs e)
+ {
+ UpdateVisualState();
+ }
+
+ private void DragWidget_DragDelta(object sender, DragDeltaEventArgs e)
+ {
+ ProcessMove(e);
+ }
+
+ #endregion //Event Hanlders
+
+ #region Methods
+
+ private void UpdateVisualState()
+ {
+ UpdateToggleButtonState();
+ UpdateSelectedFontFamily();
+ UpdateSelectedFontSize();
+ }
+
+ private void UpdateToggleButtonState()
+ {
+ UpdateItemCheckedState(_btnBold, TextElement.FontWeightProperty, FontWeights.Bold);
+ UpdateItemCheckedState(_btnItalic, TextElement.FontStyleProperty, FontStyles.Italic);
+ UpdateItemCheckedState(_btnUnderline, Inline.TextDecorationsProperty, TextDecorations.Underline);
+
+ UpdateItemCheckedState(_btnAlignLeft, Paragraph.TextAlignmentProperty, TextAlignment.Left);
+ UpdateItemCheckedState(_btnAlignCenter, Paragraph.TextAlignmentProperty, TextAlignment.Center);
+ UpdateItemCheckedState(_btnAlignRight, Paragraph.TextAlignmentProperty, TextAlignment.Right);
+ }
+
+ void UpdateItemCheckedState(ToggleButton button, DependencyProperty formattingProperty, object expectedValue)
+ {
+ object currentValue = Target.Selection.GetPropertyValue(formattingProperty);
+ button.IsChecked = (currentValue == DependencyProperty.UnsetValue) ? false : currentValue != null && currentValue.Equals(expectedValue);
+ }
+
+ private void UpdateSelectedFontFamily()
+ {
+ object value = Target.Selection.GetPropertyValue(TextElement.FontFamilyProperty);
+ FontFamily currentFontFamily = (FontFamily)((value == DependencyProperty.UnsetValue) ? null : value);
+ if (currentFontFamily != null)
+ {
+ _cmbFontFamilies.SelectedItem = currentFontFamily;
+ }
+ }
+
+ private void UpdateSelectedFontSize()
+ {
+ object value = Target.Selection.GetPropertyValue(TextElement.FontSizeProperty);
+ _cmbFontSizes.SelectedValue = (value == DependencyProperty.UnsetValue) ? null : value;
+ }
+
+ void ApplyPropertyValueToSelectedText(DependencyProperty formattingProperty, object value)
+ {
+ if (value == null)
+ return;
+
+ Target.Selection.ApplyPropertyValue(formattingProperty, value);
+ }
+
+ private void ProcessMove(DragDeltaEventArgs e)
+ {
+ AdornerLayer layer = AdornerLayer.GetAdornerLayer(Target);
+ UIElementAdorner adorner = layer.GetAdorners(Target)[0] as UIElementAdorner;
+ adorner.SetOffsets(adorner.OffsetLeft + e.HorizontalChange, adorner.OffsetTop + e.VerticalChange);
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs
new file mode 100644
index 00000000..1b03394f
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs
@@ -0,0 +1,187 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using Microsoft.Windows.Controls.Core;
+using System.Windows.Input;
+
+namespace Microsoft.Windows.Controls
+{
+ public class RichTextBoxFormatBarManager : DependencyObject
+ {
+ #region Members
+
+ private global::System.Windows.Controls.RichTextBox _richTextBox;
+ private UIElementAdorner _adorner;
+ private IRichTextBoxFormatBar _toolbar;
+
+ #endregion //Members
+
+ #region Properties
+
+ #region FormatBar
+
+ public static readonly DependencyProperty FormatBarProperty = DependencyProperty.RegisterAttached("FormatBar", typeof(IRichTextBoxFormatBar), typeof(RichTextBox), new PropertyMetadata(null, OnFormatBarPropertyChanged));
+ public static void SetFormatBar(UIElement element, IRichTextBoxFormatBar value)
+ {
+ element.SetValue(FormatBarProperty, value);
+ }
+ public static IRichTextBoxFormatBar GetFormatBar(UIElement element)
+ {
+ return (IRichTextBoxFormatBar)element.GetValue(FormatBarProperty);
+ }
+
+ private static void OnFormatBarPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ global::System.Windows.Controls.RichTextBox rtb = d as global::System.Windows.Controls.RichTextBox;
+ if (rtb == null)
+ throw new Exception("A FormatBar can only be applied to a RichTextBox.");
+
+ RichTextBoxFormatBarManager manager = new RichTextBoxFormatBarManager();
+ manager.AttachFormatBarToRichtextBox(rtb, e.NewValue as IRichTextBoxFormatBar);
+ }
+
+ #endregion //FormatBar
+
+ bool AdornerIsVisible
+ {
+ get { return _adorner.Visibility == Visibility.Visible; }
+ }
+
+ #endregion //Properties
+
+ #region Event Handlers
+
+ void RichTextBox_MouseButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ if (e.LeftButton == MouseButtonState.Released)
+ {
+ TextRange selectedText = new TextRange(_richTextBox.Selection.Start, _richTextBox.Selection.End);
+ if (selectedText.Text.Length > 0 && !String.IsNullOrEmpty(selectedText.Text))
+ {
+ ShowAdorner();
+ }
+ else
+ {
+ HideAdorner();
+ }
+ }
+
+ e.Handled = true;
+ }
+
+ void RichTextBox_PreviewMouseMove(object sender, MouseEventArgs e)
+ {
+ //if the mouse moves outside the richtextbox bounds hide the adorner
+ //though this deosn't always work, especially if the user moves the mouse very quickly.
+ //need to find a better solution, but this will work for now.
+ Point p = e.GetPosition(_richTextBox);
+ if (p.X <= 5.0 || p.X >= _richTextBox.ActualWidth - 5 || p.Y <= 3.0 || p.Y >= _richTextBox.ActualHeight - 3)
+ HideAdorner();
+ }
+
+ void RichTextBox_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ //this fixes the bug when applying text transformations the text would lose it's highlight. That was because the RichTextBox was losing focus
+ //so we just give it focus again and it seems to do the trick of re-highlighting it.
+ if (!_richTextBox.IsFocused)
+ _richTextBox.Focus();
+ }
+
+ #endregion //Event Handlers
+
+ #region Methods
+
+ ///
+ /// Attaches a FormatBar to a RichtextBox
+ ///
+ /// The RichtextBox to attach to.
+ /// The Formatbar to attach.
+ private void AttachFormatBarToRichtextBox(global::System.Windows.Controls.RichTextBox richTextBox, IRichTextBoxFormatBar formatBar)
+ {
+ _richTextBox = richTextBox;
+ _richTextBox.PreviewMouseMove += RichTextBox_PreviewMouseMove;
+ //we cannot use the PreviewMouseLeftButtonUp event because of selection bugs.
+ //we cannot use the MouseLeftButtonUp event because it is handled by the RichTextBox and does not bubble up to here, so we must
+ //add a hander to the MouseUpEvent using the Addhandler syntax, and specify to listen for handled events too.
+ _richTextBox.AddHandler(Mouse.MouseUpEvent, new MouseButtonEventHandler(RichTextBox_MouseButtonUp), true);
+ _richTextBox.TextChanged += RichTextBox_TextChanged;
+
+ _adorner = new UIElementAdorner(_richTextBox);
+
+ formatBar.Target = _richTextBox;
+ _toolbar = formatBar;
+ }
+
+ ///
+ /// Shows the FormatBar
+ ///
+ void ShowAdorner()
+ {
+ VerifyAdornerLayer();
+
+ Control adorningEditor = _toolbar as Control;
+ _adorner.Child = adorningEditor;
+ _adorner.Visibility = Visibility.Visible;
+
+ PositionFormatBar(adorningEditor);
+ }
+
+ ///
+ /// Positions the FormatBar so that is does not go outside the bounds of the RichTextBox or covers the selected text
+ ///
+ ///
+ private void PositionFormatBar(Control adorningEditor)
+ {
+ Point mousePosition = Mouse.GetPosition(_richTextBox);
+
+ double left = mousePosition.X;
+ double top = (mousePosition.Y - 15) - adorningEditor.ActualHeight;
+
+ //top
+ if (top < 0)
+ {
+ top = mousePosition.Y + 10;
+ }
+
+ //right boundary
+ if (left + adorningEditor.ActualWidth > _richTextBox.ActualWidth - 20)
+ {
+ left = left - (adorningEditor.ActualWidth - (_richTextBox.ActualWidth - left));
+ }
+
+ _adorner.SetOffsets(left, top);
+ }
+
+ ///
+ /// Ensures that the IRichTextFormatBar is in the adorner layer.
+ ///
+ /// True if the IRichTextFormatBar is in the adorner layer, else false.
+ bool VerifyAdornerLayer()
+ {
+ if (_adorner.Parent != null)
+ return true;
+
+ AdornerLayer layer = AdornerLayer.GetAdornerLayer(_richTextBox);
+ if (layer == null)
+ return false;
+
+ layer.Add(_adorner);
+ return true;
+ }
+
+ ///
+ /// Hides the IRichTextFormatBar that is in the adornor layer.
+ ///
+ void HideAdorner()
+ {
+ if (AdornerIsVisible)
+ {
+ _adorner.Visibility = Visibility.Collapsed;
+ _adorner.Child = null;
+ }
+ }
+
+ #endregion //Methods
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Themes/Generic.xaml b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Themes/Generic.xaml
new file mode 100644
index 00000000..7ad95cc4
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Themes/Generic.xaml
@@ -0,0 +1,1106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Collapsed
+
+
+
+
+
+
+ Collapsed
+
+
+
+
+
+
+
+
+
+
+ Visible
+
+
+
+
+
+
+ Visible
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/UpDownBase/UpDownBase.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/UpDownBase/UpDownBase.cs
new file mode 100644
index 00000000..aed90390
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/UpDownBase/UpDownBase.cs
@@ -0,0 +1,321 @@
+using System;
+using System.Windows.Input;
+using System.Windows.Controls;
+using System.Windows;
+
+namespace Microsoft.Windows.Controls
+{
+ public abstract class UpDownBase : Control
+ {
+ #region Members
+
+ ///
+ /// Name constant for Text template part.
+ ///
+ internal const string ElementTextName = "Text";
+
+ ///
+ /// Name constant for Spinner template part.
+ ///
+ internal const string ElementSpinnerName = "Spinner";
+
+ ///
+ /// Flags if the Text and Value properties are in the process of being sync'd
+ ///
+ bool _isSyncingTextAndValueProperties;
+
+ #endregion //Members
+
+ #region Properties
+
+ #region Value
+
+ public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(T), typeof(UpDownBase), new FrameworkPropertyMetadata(default(T), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValuePropertyChanged));
+ public virtual T Value
+ {
+ get { return (T)GetValue(ValueProperty); }
+ set { SetValue(ValueProperty, value); }
+ }
+
+ private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ UpDownBase udb = (UpDownBase)d;
+ T oldValue = (T)e.OldValue;
+ T newValue = (T)e.NewValue;
+
+ udb.SyncTextAndValueProperties(e.Property, e.NewValue);
+
+ RoutedPropertyChangedEventArgs changedArgs = new RoutedPropertyChangedEventArgs(oldValue, newValue);
+ udb.OnValueChanged(changedArgs);
+ }
+
+ protected virtual void OnValueChanged(RoutedPropertyChangedEventArgs e)
+ {
+ if (ValueChanged != null)
+ ValueChanged(this, e);
+ }
+
+ #endregion //Value
+
+ #region Text
+
+ public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UpDownBase), new FrameworkPropertyMetadata("0", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnTextPropertyChanged));
+ public string Text
+ {
+ get { return (string)GetValue(TextProperty); }
+ set { SetValue(TextProperty, value); }
+ }
+
+ private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ UpDownBase udb = (UpDownBase)d;
+ udb.SyncTextAndValueProperties(e.Property, e.NewValue);
+ }
+
+ #endregion //Text
+
+ #region IsEditable
+
+ public static readonly DependencyProperty IsEditableProperty = DependencyProperty.Register("IsEditable", typeof(bool), typeof(UpDownBase), new PropertyMetadata(true, OnIsEditablePropertyChanged));
+ public bool IsEditable
+ {
+ get { return (bool)GetValue(IsEditableProperty); }
+ set { SetValue(IsEditableProperty, value); }
+ }
+
+ private static void OnIsEditablePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ UpDownBase source = d as UpDownBase;
+ source.OnIsEditableChanged((bool)e.OldValue, (bool)e.NewValue);
+ }
+
+ protected virtual void OnIsEditableChanged(bool oldValue, bool newValue)
+ {
+ if (TextBox != null)
+ TextBox.IsReadOnly = !IsEditable;
+ }
+
+ #endregion //IsEditable
+
+ internal TextBox TextBox { get; private set; }
+
+ private Spinner _spinner;
+ internal Spinner Spinner
+ {
+ get { return _spinner; }
+ private set
+ {
+ _spinner = value;
+ _spinner.Spin += OnSpinnerSpin;
+ }
+ }
+
+ #endregion //Properties
+
+ #region Constructors
+
+ protected UpDownBase() { }
+
+ #endregion //Constructors
+
+ #region Base Class Overrides
+
+ public override void OnApplyTemplate()
+ {
+ base.OnApplyTemplate();
+
+ TextBox = GetTemplateChild(ElementTextName) as TextBox;
+ Spinner = GetTemplateChild(ElementSpinnerName) as Spinner;
+
+ if (TextBox != null)
+ TextBox.IsReadOnly = !IsEditable;
+ }
+
+ protected override void OnPreviewKeyDown(KeyEventArgs e)
+ {
+ switch (e.Key)
+ {
+ case Key.Up:
+ {
+ DoIncrement();
+ e.Handled = true;
+ break;
+ }
+ case Key.Down:
+ {
+ DoDecrement();
+ e.Handled = true;
+ break;
+ }
+ case Key.Enter:
+ {
+ SyncTextAndValueProperties(UpDownBase.TextProperty, TextBox.Text);
+ break;
+ }
+ }
+ }
+
+ protected override void OnMouseWheel(MouseWheelEventArgs e)
+ {
+ base.OnMouseWheel(e);
+
+ if (!e.Handled)
+ {
+ if (e.Delta < 0)
+ {
+ DoDecrement();
+ }
+ else if (0 < e.Delta)
+ {
+ DoIncrement();
+ }
+
+ e.Handled = true;
+ }
+ }
+
+ #endregion //Base Class Overrides
+
+ #region Methods
+
+ #region Abstract
+
+ ///
+ /// Called by ApplyValue to parse user input.
+ ///
+ /// User input.
+ /// Value parsed from user input.
+ protected abstract T ParseValue(string text);
+
+ ///
+ /// Renders the value property into the textbox text.
+ ///
+ /// Formatted Value.
+ protected internal abstract string FormatValue();
+
+ ///
+ /// Called by OnSpin when the spin direction is SpinDirection.Increase.
+ ///
+ protected abstract void OnIncrement();
+
+ ///
+ /// Called by OnSpin when the spin direction is SpinDirection.Descrease.
+ ///
+ protected abstract void OnDecrement();
+
+ #endregion //Abstract
+
+ #region Protected
+
+ ///
+ /// GetValue override to return Value property as object type.
+ ///
+ /// The Value property as object type.
+ protected object GetValue()
+ {
+ return Value;
+ }
+
+ ///
+ /// SetValue override to set value to Value property.
+ ///
+ /// New value.
+ protected void SetValue(object value)
+ {
+ Value = (T)value;
+ }
+
+ #endregion //Protected
+
+ #region Private
+
+ ///
+ /// Performs an increment if conditions allow it.
+ ///
+ private void DoDecrement()
+ {
+ if (Spinner == null || (Spinner.ValidSpinDirection & ValidSpinDirections.Decrease) == ValidSpinDirections.Decrease)
+ {
+ OnDecrement();
+ }
+ }
+
+ ///
+ /// Performs a decrement if conditions allow it.
+ ///
+ private void DoIncrement()
+ {
+ if (Spinner == null || (Spinner.ValidSpinDirection & ValidSpinDirections.Increase) == ValidSpinDirections.Increase)
+ {
+ OnIncrement();
+ }
+ }
+
+ protected void SyncTextAndValueProperties(DependencyProperty p, object newValue)
+ {
+ //prevents recursive syncing properties
+ if (_isSyncingTextAndValueProperties)
+ return;
+
+ _isSyncingTextAndValueProperties = true;
+
+ //this only occures when the user typed in the value
+ if (UpDownBase.TextProperty == p)
+ {
+ SetValue(UpDownBase.ValueProperty, ParseValue(newValue.ToString()));
+ }
+
+ //we need to update the text no matter what because the user could have used the spin buttons to change dthe value
+ //or typed in the textbox so we need to reformat the entered value.
+ SetValue(UpDownBase.TextProperty, FormatValue());
+
+ _isSyncingTextAndValueProperties = false;
+ }
+
+ #endregion //Private
+
+ #region Virtual
+
+ ///
+ /// Occurs when the spinner spins.
+ ///
+ /// Event args.
+ protected virtual void OnSpin(SpinEventArgs e)
+ {
+ if (e == null)
+ throw new ArgumentNullException("e");
+
+ if (e.Direction == SpinDirection.Increase)
+ DoIncrement();
+ else
+ DoDecrement();
+ }
+
+ #endregion //Virtual
+
+ #endregion //Methods
+
+ #region Event Handlers
+
+ ///
+ /// Event handler for Spinner template part's Spin event.
+ ///
+ /// The Spinner template part.
+ /// Event args.
+ private void OnSpinnerSpin(object sender, SpinEventArgs e)
+ {
+ OnSpin(e);
+ }
+
+ #endregion //Event Handlers
+
+ #region Events
+
+ ///
+ /// Occurs when Value property has changed.
+ ///
+ public event RoutedPropertyChangedEventHandler ValueChanged;
+
+ #endregion //Events
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/VisualStates.cs b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/VisualStates.cs
new file mode 100644
index 00000000..721a96e2
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/VisualStates.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Microsoft.Windows.Controls
+{
+ internal static partial class VisualStates
+ {
+
+ }
+}
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj
new file mode 100644
index 00000000..bd366366
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj
@@ -0,0 +1,144 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {72E591D6-8F83-4D8C-8F67-9C325E623234}
+ library
+ Properties
+ Microsoft.Windows.Controls
+ WPFToolkit.Extended
+ v3.5
+ Client
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+ 3.5
+
+
+
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+ RichTextBoxFormatBar.xaml
+
+
+
+
+
+
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj.vspscc b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj.vspscc
new file mode 100644
index 00000000..feffdeca
--- /dev/null
+++ b/Release/v1.2.0/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = ""
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}