diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs
index 5dd960fd..f7b3c6fa 100644
--- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs
@@ -4,24 +4,57 @@ using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
+using Microsoft.Windows.Controls.Core.Utilities;
namespace Microsoft.Windows.Controls
{
- public static class CalculatorCommands
- {
- private static RoutedCommand _calculatorButtonClickCommand = new RoutedCommand();
- public static RoutedCommand CalculatorButtonClick
- {
- get { return _calculatorButtonClickCommand; }
- }
- }
-
public class Calculator : Control
{
+ #region Members
+
private ContentControl _buttonPanel;
private readonly DispatcherTimer _timer;
private Button _calculatorButton;
+ #endregion //Members
+
+ #region Enumerations
+
+ public enum CalculatorButtonType
+ {
+ Add,
+ Back,
+ Cancel,
+ Clear,
+ Decimal,
+ Divide,
+ Eight,
+ Equal,
+ Five,
+ Four,
+ Fract,
+ MAdd,
+ MC,
+ MR,
+ MS,
+ MSub,
+ Multiply,
+ Nine,
+ None,
+ One,
+ Percent,
+ Seven,
+ Sign,
+ Six,
+ Sqrt,
+ Subtract,
+ Three,
+ Two,
+ Zero
+ }
+
+ #endregion //Enumerations
+
#region Properties
public ICommand CalculaterButtonClickCommand { get; private set; }
@@ -45,12 +78,33 @@ namespace Microsoft.Windows.Controls
{
Button button = o as Button;
button.CommandParameter = newValue;
- button.Content = GetCalculatorButtonContent(newValue);
+ button.Content = CalculatorUtilities.GetCalculatorButtonContent(newValue);
}
#endregion //CalculatorButtonType
+ #region DisplayText
+
+ public static readonly DependencyProperty DisplayTextProperty = DependencyProperty.Register("DisplayText", typeof(string), typeof(Calculator), new UIPropertyMetadata("0", OnDisplayTextChanged));
+ public string DisplayText
+ {
+ get { return (string)GetValue(DisplayTextProperty); }
+ set { SetValue(DisplayTextProperty, value); }
+ }
+
+ private static void OnDisplayTextChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
+ {
+ Calculator calculator = o as Calculator;
+ if (calculator != null)
+ calculator.OnDisplayTextChanged((string)e.OldValue, (string)e.NewValue);
+ }
+ protected virtual void OnDisplayTextChanged(string oldValue, string newValue)
+ {
+ // TODO: Add your property changed side-effects. Descendants can override as well.
+ }
+
+ #endregion //DisplayText
#region Value
@@ -107,54 +161,14 @@ namespace Microsoft.Windows.Controls
protected override void OnTextInput(TextCompositionEventArgs e)
{
- var buttonType = GetCalculatorButtonTypeFromText(e.Text);
-
- AnimateCalculatorButtonClick(buttonType);
- }
-
- private void AnimateCalculatorButtonClick(CalculatorButtonType buttonType)
- {
- _calculatorButton = FindButtonByCalculatorButtonType(_buttonPanel, buttonType);
- if (_calculatorButton != null)
+ var buttonType = CalculatorUtilities.GetCalculatorButtonTypeFromText(e.Text);
+ if (buttonType != CalculatorButtonType.None)
{
- VisualStateManager.GoToState(_calculatorButton, "Pressed", true);
- _timer.Start();
+ AnimateCalculatorButtonClick(buttonType);
+ ProcessCalculatorButton(buttonType);
}
}
- private CalculatorButtonType GetCalculatorButtonTypeFromText(string text)
- {
- switch (text)
- {
- case "0": return CalculatorButtonType.Zero;
- case "1": return CalculatorButtonType.One;
- case "2": return CalculatorButtonType.Two;
- case "3": return CalculatorButtonType.Three;
- case "4": return CalculatorButtonType.Four;
- case "5": return CalculatorButtonType.Five;
- case "6": return CalculatorButtonType.Six;
- case "7": return CalculatorButtonType.Seven;
- case "8": return CalculatorButtonType.Eight;
- case "9": return CalculatorButtonType.Nine;
- case "%": return CalculatorButtonType.Percent;
- case "+": return CalculatorButtonType.Add;
- case "-": return CalculatorButtonType.Subtract;
- case "*": return CalculatorButtonType.Mul;
- case "/":
- case ":": return CalculatorButtonType.Div;
- case " ":
- case "\r":
- case "=": return CalculatorButtonType.Equal;
- case "\b": return CalculatorButtonType.Back;
- }
-
- //check for the escape key
- if (text == ((char)27).ToString())
- return CalculatorButtonType.Clear;
-
- return CalculatorButtonType.None;
- }
-
#endregion //Base Class Overrides
#region Event Handlers
@@ -174,167 +188,70 @@ namespace Microsoft.Windows.Controls
#region Methods
- public static Button FindButtonByCalculatorButtonType(DependencyObject parent, CalculatorButtonType type)
+ private void AnimateCalculatorButtonClick(CalculatorButtonType buttonType)
{
- for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
- {
- var child = VisualTreeHelper.GetChild(parent, i);
+ _calculatorButton = CalculatorUtilities.FindButtonByCalculatorButtonType(_buttonPanel, buttonType);
+ VisualStateManager.GoToState(_calculatorButton, "Pressed", true);
+ _timer.Start();
+ }
- object buttonType = child.GetValue(Button.CommandParameterProperty);
+ private void ProcessCalculatorButton(CalculatorButtonType buttonType)
+ {
+ if (CalculatorUtilities.IsDigit(buttonType))
+ ProcessDigit(buttonType);
+ else if (CalculatorUtilities.IsOperation(buttonType))
+ ProcessOperation(buttonType);
+ else
+ ProcessMisc(buttonType);
+ }
- if (buttonType != null && (CalculatorButtonType)buttonType == type)
- {
- return child as Button;
- }
- else
- {
- var result = FindButtonByCalculatorButtonType(child, type);
+ private void ProcessDigit(CalculatorButtonType butonType)
+ {
- if (result != null)
- return result;
- }
- }
- return null;
}
- private static string GetCalculatorButtonContent(CalculatorButtonType type)
+ private void ProcessOperation(CalculatorButtonType buttonType)
{
- string content = string.Empty;
- switch (type)
+ switch (buttonType)
{
case CalculatorButtonType.Add:
- content = "+";
- break;
- case CalculatorButtonType.Back:
- content = "Back";
- break;
- case CalculatorButtonType.Cancel:
- content = "CE";
- break;
- case CalculatorButtonType.Clear:
- content = "C";
- break;
- case CalculatorButtonType.Decimal:
- content = ".";
- break;
- case CalculatorButtonType.Div:
- content = "/";
- break;
- case CalculatorButtonType.Eight:
- content = "8";
- break;
- case CalculatorButtonType.Equal:
- content = "=";
- break;
- case CalculatorButtonType.Five:
- content = "5";
- break;
- case CalculatorButtonType.Four:
- content = "4";
- break;
- case CalculatorButtonType.Fract:
- content = "1/x";
- break;
- case CalculatorButtonType.MAdd:
- content = "M+";
- break;
- case CalculatorButtonType.MC:
- content = "MC";
- break;
- case CalculatorButtonType.MR:
- content = "MR";
- break;
- case CalculatorButtonType.MS:
- content = "MS";
- break;
- case CalculatorButtonType.MSub:
- content = "M-";
- break;
- case CalculatorButtonType.Mul:
- content = "*";
- break;
- case CalculatorButtonType.Nine:
- content = "9";
- break;
- case CalculatorButtonType.None:
- break;
- case CalculatorButtonType.One:
- content = "1";
- break;
- case CalculatorButtonType.Percent:
- content = "%";
- break;
- case CalculatorButtonType.Seven:
- content = "7";
- break;
- case CalculatorButtonType.Sign:
- content = "+/-";
- break;
- case CalculatorButtonType.Six:
- content = "6";
- break;
- case CalculatorButtonType.Sqrt:
- content = "Sqrt";
+
break;
case CalculatorButtonType.Subtract:
- content = "-";
+
break;
- case CalculatorButtonType.Three:
- content = "3";
+ case CalculatorButtonType.Multiply:
+
break;
- case CalculatorButtonType.Two:
- content = "2";
+ case CalculatorButtonType.Divide:
+
break;
- case CalculatorButtonType.Zero:
- content = "0";
+ case CalculatorButtonType.Percent:
+
break;
}
- return content;
}
- #endregion //Methods
+ private void ProcessMisc(CalculatorButtonType buttonType)
+ {
- #region Commands
+ }
- private void ExecuteCalculatorButtonClick(object sender, ExecutedRoutedEventArgs e)
+ private void CalculateValue()
{
}
- #endregion //Commands
+ #endregion //Methods
+ #region Commands
- public enum CalculatorButtonType
+ private void ExecuteCalculatorButtonClick(object sender, ExecutedRoutedEventArgs e)
{
- Add,
- Back,
- Cancel,
- Clear,
- Decimal,
- Div,
- Eight,
- Equal,
- Five,
- Four,
- Fract,
- MAdd,
- MC,
- MR,
- MS,
- MSub,
- Mul,
- Nine,
- None,
- One,
- Percent,
- Seven,
- Sign,
- Six,
- Sqrt,
- Subtract,
- Three,
- Two,
- Zero
+ var buttonType = (CalculatorButtonType)e.Parameter;
+ ProcessCalculatorButton(buttonType);
}
+
+ #endregion //Commands
}
}
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/CalculatorCommands.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/CalculatorCommands.cs
new file mode 100644
index 00000000..47fbc8df
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/CalculatorCommands.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Windows.Input;
+
+namespace Microsoft.Windows.Controls
+{
+ public static class CalculatorCommands
+ {
+ private static RoutedCommand _calculatorButtonClickCommand = new RoutedCommand();
+ public static RoutedCommand CalculatorButtonClick
+ {
+ get { return _calculatorButtonClickCommand; }
+ }
+ }
+}
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml
index a11484f2..b07215ec 100644
--- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml
@@ -364,7 +364,7 @@
Style="{StaticResource CalculatorDigitButtonStyle}"/>
@@ -389,7 +389,7 @@
Style="{StaticResource CalculatorDigitButtonStyle}"/>
@@ -464,15 +464,20 @@
-
+
+ Text="{Binding DisplayText, RelativeSource={RelativeSource TemplatedParent}}" />
+
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs
new file mode 100644
index 00000000..f84b89a6
--- /dev/null
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs
@@ -0,0 +1,194 @@
+using System;
+using System.Windows.Controls;
+using System.Windows;
+using System.Windows.Media;
+
+namespace Microsoft.Windows.Controls.Core.Utilities
+{
+ static class CalculatorUtilities
+ {
+ public static Calculator.CalculatorButtonType GetCalculatorButtonTypeFromText(string text)
+ {
+ switch (text)
+ {
+ case "0": return Calculator.CalculatorButtonType.Zero;
+ case "1": return Calculator.CalculatorButtonType.One;
+ case "2": return Calculator.CalculatorButtonType.Two;
+ case "3": return Calculator.CalculatorButtonType.Three;
+ case "4": return Calculator.CalculatorButtonType.Four;
+ case "5": return Calculator.CalculatorButtonType.Five;
+ case "6": return Calculator.CalculatorButtonType.Six;
+ case "7": return Calculator.CalculatorButtonType.Seven;
+ case "8": return Calculator.CalculatorButtonType.Eight;
+ case "9": return Calculator.CalculatorButtonType.Nine;
+ case "+": return Calculator.CalculatorButtonType.Add;
+ case "-": return Calculator.CalculatorButtonType.Subtract;
+ case "*": return Calculator.CalculatorButtonType.Multiply;
+ case "/": return Calculator.CalculatorButtonType.Divide;
+ case "%": return Calculator.CalculatorButtonType.Percent;
+ case "\b": return Calculator.CalculatorButtonType.Back;
+ case "\r":
+ case "=": return Calculator.CalculatorButtonType.Equal;
+ }
+
+ //check for the escape key
+ if (text == ((char)27).ToString())
+ return Calculator.CalculatorButtonType.Clear;
+
+ return Calculator.CalculatorButtonType.None;
+ }
+
+ public static Button FindButtonByCalculatorButtonType(DependencyObject parent, Calculator.CalculatorButtonType type)
+ {
+ for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
+ {
+ var child = VisualTreeHelper.GetChild(parent, i);
+
+ object buttonType = child.GetValue(Button.CommandParameterProperty);
+
+ if (buttonType != null && (Calculator.CalculatorButtonType)buttonType == type)
+ {
+ return child as Button;
+ }
+ else
+ {
+ var result = FindButtonByCalculatorButtonType(child, type);
+
+ if (result != null)
+ return result;
+ }
+ }
+ return null;
+ }
+
+ public static string GetCalculatorButtonContent(Calculator.CalculatorButtonType type)
+ {
+ string content = string.Empty;
+ switch (type)
+ {
+ case Calculator.CalculatorButtonType.Add:
+ content = "+";
+ break;
+ case Calculator.CalculatorButtonType.Back:
+ content = "Back";
+ break;
+ case Calculator.CalculatorButtonType.Cancel:
+ content = "CE";
+ break;
+ case Calculator.CalculatorButtonType.Clear:
+ content = "C";
+ break;
+ case Calculator.CalculatorButtonType.Decimal:
+ content = ".";
+ break;
+ case Calculator.CalculatorButtonType.Divide:
+ content = "/";
+ break;
+ case Calculator.CalculatorButtonType.Eight:
+ content = "8";
+ break;
+ case Calculator.CalculatorButtonType.Equal:
+ content = "=";
+ break;
+ case Calculator.CalculatorButtonType.Five:
+ content = "5";
+ break;
+ case Calculator.CalculatorButtonType.Four:
+ content = "4";
+ break;
+ case Calculator.CalculatorButtonType.Fract:
+ content = "1/x";
+ break;
+ case Calculator.CalculatorButtonType.MAdd:
+ content = "M+";
+ break;
+ case Calculator.CalculatorButtonType.MC:
+ content = "MC";
+ break;
+ case Calculator.CalculatorButtonType.MR:
+ content = "MR";
+ break;
+ case Calculator.CalculatorButtonType.MS:
+ content = "MS";
+ break;
+ case Calculator.CalculatorButtonType.MSub:
+ content = "M-";
+ break;
+ case Calculator.CalculatorButtonType.Multiply:
+ content = "*";
+ break;
+ case Calculator.CalculatorButtonType.Nine:
+ content = "9";
+ break;
+ case Calculator.CalculatorButtonType.None:
+ break;
+ case Calculator.CalculatorButtonType.One:
+ content = "1";
+ break;
+ case Calculator.CalculatorButtonType.Percent:
+ content = "%";
+ break;
+ case Calculator.CalculatorButtonType.Seven:
+ content = "7";
+ break;
+ case Calculator.CalculatorButtonType.Sign:
+ content = "+/-";
+ break;
+ case Calculator.CalculatorButtonType.Six:
+ content = "6";
+ break;
+ case Calculator.CalculatorButtonType.Sqrt:
+ content = "Sqrt";
+ break;
+ case Calculator.CalculatorButtonType.Subtract:
+ content = "-";
+ break;
+ case Calculator.CalculatorButtonType.Three:
+ content = "3";
+ break;
+ case Calculator.CalculatorButtonType.Two:
+ content = "2";
+ break;
+ case Calculator.CalculatorButtonType.Zero:
+ content = "0";
+ break;
+ }
+ return content;
+ }
+
+ public static bool IsDigit(Calculator.CalculatorButtonType buttonType)
+ {
+ switch (buttonType)
+ {
+ case Calculator.CalculatorButtonType.Zero:
+ case Calculator.CalculatorButtonType.One:
+ case Calculator.CalculatorButtonType.Two:
+ case Calculator.CalculatorButtonType.Three:
+ case Calculator.CalculatorButtonType.Four:
+ case Calculator.CalculatorButtonType.Five:
+ case Calculator.CalculatorButtonType.Six:
+ case Calculator.CalculatorButtonType.Seven:
+ case Calculator.CalculatorButtonType.Eight:
+ case Calculator.CalculatorButtonType.Nine:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public static bool IsOperation(Calculator.CalculatorButtonType buttonType)
+ {
+ switch (buttonType)
+ {
+ case Calculator.CalculatorButtonType.Add:
+ case Calculator.CalculatorButtonType.Subtract:
+ case Calculator.CalculatorButtonType.Multiply:
+ case Calculator.CalculatorButtonType.Divide:
+ case Calculator.CalculatorButtonType.Percent:
+ return true;
+ default:
+ return false;
+ }
+ }
+ }
+}
diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj
index 8ff6b23c..93bb8749 100644
--- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj
+++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj
@@ -144,6 +144,7 @@
+
@@ -157,6 +158,7 @@
+