5 changed files with 259 additions and 26 deletions
@ -0,0 +1,121 @@ |
|||
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; |
|||
using System.Windows.Controls.Primitives; |
|||
|
|||
namespace Microsoft.Windows.Controls |
|||
{ |
|||
public class CalculatorUpDown : NumericUpDown |
|||
{ |
|||
#region Members
|
|||
|
|||
private Popup _calculatorPopup; |
|||
private Calculator _calculator; |
|||
|
|||
#endregion //Members
|
|||
|
|||
#region Properties
|
|||
|
|||
#region IsOpen
|
|||
|
|||
public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register("IsOpen", typeof(bool), typeof(CalculatorUpDown), new UIPropertyMetadata(false, OnIsOpenChanged)); |
|||
public bool IsOpen |
|||
{ |
|||
get { return (bool)GetValue(IsOpenProperty); } |
|||
set { SetValue(IsOpenProperty, value); } |
|||
} |
|||
|
|||
private static void OnIsOpenChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) |
|||
{ |
|||
CalculatorUpDown calculatorUpDown = o as CalculatorUpDown; |
|||
if (calculatorUpDown != null) |
|||
calculatorUpDown.OnIsOpenChanged((bool)e.OldValue, (bool)e.NewValue); |
|||
} |
|||
|
|||
protected virtual void OnIsOpenChanged(bool oldValue, bool newValue) |
|||
{ |
|||
|
|||
} |
|||
|
|||
#endregion //IsOpen
|
|||
|
|||
#endregion //Properties
|
|||
|
|||
#region Constructors
|
|||
|
|||
static CalculatorUpDown() |
|||
{ |
|||
DefaultStyleKeyProperty.OverrideMetadata(typeof(CalculatorUpDown), new FrameworkPropertyMetadata(typeof(CalculatorUpDown))); |
|||
} |
|||
|
|||
public CalculatorUpDown() |
|||
{ |
|||
Keyboard.AddKeyDownHandler(this, OnKeyDown); |
|||
Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(this, OnMouseDownOutsideCapturedElement); |
|||
} |
|||
|
|||
#endregion //Constructors
|
|||
|
|||
#region Base Class Overrides
|
|||
|
|||
public override void OnApplyTemplate() |
|||
{ |
|||
base.OnApplyTemplate(); |
|||
_calculatorPopup = (Popup)GetTemplateChild("PART_CalculatorPopup"); |
|||
_calculatorPopup.Opened += CalculatorPopup_Opened; |
|||
|
|||
_calculator = (Calculator)GetTemplateChild("PART_Calculator"); |
|||
} |
|||
|
|||
#endregion //Base Class Overrides
|
|||
|
|||
#region Event Handlers
|
|||
|
|||
void CalculatorPopup_Opened(object sender, EventArgs e) |
|||
{ |
|||
_calculator.Focus(); |
|||
} |
|||
|
|||
private void OnKeyDown(object sender, KeyEventArgs e) |
|||
{ |
|||
switch (e.Key) |
|||
{ |
|||
case Key.Escape: |
|||
case Key.Tab: |
|||
{ |
|||
CloseCalculatorUpDown(); |
|||
e.Handled = true; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
private void OnMouseDownOutsideCapturedElement(object sender, MouseButtonEventArgs e) |
|||
{ |
|||
CloseCalculatorUpDown(); |
|||
} |
|||
|
|||
#endregion //Event Handlers
|
|||
|
|||
#region Methods
|
|||
|
|||
private void CloseCalculatorUpDown() |
|||
{ |
|||
if (IsOpen) |
|||
IsOpen = false; |
|||
ReleaseMouseCapture(); |
|||
} |
|||
|
|||
#endregion //Methods
|
|||
} |
|||
} |
|||
@ -0,0 +1,107 @@ |
|||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:local="clr-namespace:Microsoft.Windows.Controls" |
|||
xmlns:chrome="clr-namespace:Microsoft.Windows.Controls.Chromes" |
|||
xmlns:coreConverters="clr-namespace:Microsoft.Windows.Controls.Core.Converters"> |
|||
|
|||
<coreConverters:InverseBoolConverter x:Key="InverseBoolConverter" /> |
|||
|
|||
<LinearGradientBrush x:Key="PopupDarkBorderBrush" EndPoint="0.5,1" StartPoint="0.5,0"> |
|||
<GradientStop Color="#FFA3AEB9" Offset="0"/> |
|||
<GradientStop Color="#FF8399A9" Offset="0.375"/> |
|||
<GradientStop Color="#FF718597" Offset="0.375"/> |
|||
<GradientStop Color="#FF617584" Offset="1"/> |
|||
</LinearGradientBrush> |
|||
|
|||
<LinearGradientBrush x:Key="PopupBackgroundBrush" StartPoint="0,0" EndPoint="0,1"> |
|||
<LinearGradientBrush.GradientStops> |
|||
<GradientStopCollection> |
|||
<GradientStop Offset="0" Color="#FFffffff"/> |
|||
<GradientStop Offset="1" Color="#FFE8EBED"/> |
|||
</GradientStopCollection> |
|||
</LinearGradientBrush.GradientStops> |
|||
</LinearGradientBrush> |
|||
|
|||
<Style x:Key="CalculatorToggleButtonStyle" TargetType="ToggleButton"> |
|||
<Setter Property="Template"> |
|||
<Setter.Value> |
|||
<ControlTemplate TargetType="ToggleButton"> |
|||
<Grid SnapsToDevicePixels="True"> |
|||
<chrome:ButtonChrome x:Name="ToggleButtonChrome" |
|||
CornerRadius="0,2.75,2.75,0" |
|||
RenderMouseOver="{TemplateBinding IsMouseOver}" |
|||
RenderPressed="{TemplateBinding IsPressed}" /> |
|||
|
|||
<Grid> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="*"/> |
|||
<ColumnDefinition Width="Auto"/> |
|||
</Grid.ColumnDefinitions> |
|||
|
|||
<ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> |
|||
|
|||
<Grid x:Name="arrowGlyph" IsHitTestVisible="False" Grid.Column="1" Margin="5"> |
|||
<Path Width="7" Height="4" Data="M 0,1 C0,1 0,0 0,0 0,0 3,0 3,0 3,0 3,1 3,1 3,1 4,1 4,1 4,1 4,0 4,0 4,0 7,0 7,0 7,0 7,1 7,1 7,1 6,1 6,1 6,1 6,2 6,2 6,2 5,2 5,2 5,2 5,3 5,3 5,3 4,3 4,3 4,3 4,4 4,4 4,4 3,4 3,4 3,4 3,3 3,3 3,3 2,3 2,3 2,3 2,2 2,2 2,2 1,2 1,2 1,2 1,1 1,1 1,1 0,1 0,1 z" Fill="#FF000000"/> |
|||
</Grid> |
|||
</Grid> |
|||
</Grid> |
|||
</ControlTemplate> |
|||
</Setter.Value> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
|
|||
<!-- =============================================================================== --> |
|||
<!-- CalculatorUpDown --> |
|||
<!-- =============================================================================== --> |
|||
|
|||
<Style TargetType="{x:Type local:CalculatorUpDown}"> |
|||
<Setter Property="BorderThickness" Value="1,1,0,1" /> |
|||
<Setter Property="Focusable" Value="False" /> |
|||
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> |
|||
<Setter Property="HorizontalContentAlignment" Value="Right" /> |
|||
<Setter Property="Template"> |
|||
<Setter.Value> |
|||
<ControlTemplate TargetType="{x:Type local:CalculatorUpDown}"> |
|||
<Grid> |
|||
<Grid> |
|||
<Grid.ColumnDefinitions> |
|||
<ColumnDefinition Width="*" /> |
|||
<ColumnDefinition Width="Auto" /> |
|||
</Grid.ColumnDefinitions> |
|||
<local:ButtonSpinner x:Name="Spinner" IsTabStop="False" BorderThickness="{TemplateBinding BorderThickness}" |
|||
AllowSpin="{TemplateBinding AllowSpin}" ShowButtonSpinner="{TemplateBinding ShowButtonSpinner}"> |
|||
<TextBox x:Name="TextBox" BorderThickness="0" |
|||
Background="{TemplateBinding Background}" |
|||
FontFamily="{TemplateBinding FontFamily}" |
|||
FontSize="{TemplateBinding FontSize}" |
|||
FontStretch="{TemplateBinding FontStretch}" |
|||
FontStyle="{TemplateBinding FontStyle}" |
|||
FontWeight="{TemplateBinding FontWeight}" |
|||
Foreground="{TemplateBinding Foreground}" |
|||
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" |
|||
IsReadOnly="{Binding IsEditable, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource InverseBoolConverter}}" |
|||
MinWidth="20" AcceptsReturn="False" |
|||
TextWrapping="NoWrap" |
|||
TabIndex="{TemplateBinding TabIndex}" |
|||
Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}}" /> |
|||
</local:ButtonSpinner> |
|||
<ToggleButton x:Name="_calculatorToggleButton" Grid.Column="1" |
|||
IsChecked="{Binding IsOpen, RelativeSource={RelativeSource TemplatedParent}}" |
|||
Style="{StaticResource CalculatorToggleButtonStyle}" |
|||
IsHitTestVisible="{Binding IsOpen, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource InverseBoolConverter}}"/> |
|||
</Grid> |
|||
<Popup x:Name="PART_CalculatorPopup" IsOpen="{Binding IsChecked, ElementName=_calculatorToggleButton}" StaysOpen="False"> |
|||
<Border BorderThickness="1" Background="{StaticResource PopupBackgroundBrush}" BorderBrush="{StaticResource PopupDarkBorderBrush}" Padding="3"> |
|||
<StackPanel> |
|||
<local:Calculator x:Name="PART_Calculator" Value="{Binding Value, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" BorderThickness="0" /> |
|||
</StackPanel> |
|||
</Border> |
|||
</Popup> |
|||
</Grid> |
|||
</ControlTemplate> |
|||
</Setter.Value> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
</ResourceDictionary> |
|||
Loading…
Reference in new issue