WPF控件NumericUpDown示例

(转载请注明出处)

工具:Expression Blend 2 + Visual Studio 2008

语言:C#

框架:.Net Framework 3.5

工程:WPF Windows Application

布局

设计预览

XAML代码:

<UserControl

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

mc:Ignorable="d"

x:Class="Sample.NumericControl"

x:Name="UserControl"

Width="200" Height="23" MaxHeight="23" MinHeight="23" MinWidth="50" xmlns:Sample="clr-namespace:Sample">

<UserControl.Resources>

<Sample:DoubleValueConverter x:Key="MyValueConverter"/>

<Style x:Key="ArrowButtonStyle" BasedOn="{x:Null}" TargetType="{x:Type Button}">

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="{x:Type Button}">

<Grid>

<Rectangle Stroke="#FFA0A0A0" d:LayoutOverrides="GridBox" RadiusX="1" RadiusY="1" Width="20" Height="8">

<Rectangle.Fill>

<LinearGradientBrush EndPoint="0.5,0" StartPoint="0.5,1">

<GradientStop Color="#FFDCDCDC" Offset="0"/>

<GradientStop Color="#FFDCDCDC" Offset="0.991"/>

<GradientStop Color="#FFC8C8C8" Offset="0.496"/>

<GradientStop Color="#FFDCDCDC" Offset="0.549"/>

</LinearGradientBrush>

</Rectangle.Fill>

</Rectangle>

<Path Fill="#FF5A5A5A" Margin="7,2,7,2" Stretch="Fill" Stroke="{x:Null}" Data="M135.66667,4.6666667 L132.16599,9.4999781 139.16621,9.4999778 z" Width="5" Height="4" HorizontalAlignment="Center" VerticalAlignment="Center"/>

</Grid>

<ControlTemplate.Triggers>

<Trigger Property="IsFocused" Value="True"/>

<Trigger Property="IsDefaulted" Value="True"/>

<Trigger Property="IsMouseOver" Value="True"/>

<Trigger Property="IsPressed" Value="True"/>

<Trigger Property="IsEnabled" Value="False"/>

</ControlTemplate.Triggers>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

</UserControl.Resources>

<Grid x:Name="LayoutRoot">

<Border x:Name="ControlBorder" CornerRadius="2,2,2,2" BorderThickness="1,1,1,1" BorderBrush="#FFA0A0A0" Background="#FFFFFFFF">

<Grid x:Name="ValueGrid" Width="Auto">

<Grid.ColumnDefinitions>

<ColumnDefinition/>

<ColumnDefinition Width="26"/>

</Grid.ColumnDefinitions>

<TextBox Grid.Column="0" BorderBrush="{x:Null}" BorderThickness="0,0,0,0" Margin="2,2,2,2" VerticalContentAlignment="Center" x:Name="ValueText" LostFocus="ValueText_LostFocus" Text="{Binding Path=Value, Converter={StaticResource MyValueConverter}, ElementName=UserControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, FallbackValue=0}"/>

<Button HorizontalAlignment="Right" Style="{DynamicResource ArrowButtonStyle}" Width="20" x:Name="UpButton" Grid.Column="1" Margin="0,2,3,0" Click="UpButton_Click" Height="8" VerticalAlignment="Top" />

<Button HorizontalAlignment="Right" Style="{DynamicResource ArrowButtonStyle}" VerticalAlignment="Bottom" Width="20" Height="8" RenderTransformOrigin="0.5,0.5" x:Name="DownButton" Grid.Column="1" Margin="0,0,3,2" Click="DownButton_Click">

<Button.RenderTransform>

<TransformGroup>

<ScaleTransform ScaleX="1" ScaleY="-1"/>

<SkewTransform AngleX="0" AngleY="0"/>

<RotateTransform Angle="0"/>

<TranslateTransform X="0" Y="0"/>

</TransformGroup>

</Button.RenderTransform>

</Button>

</Grid>

</Border>

</Grid>

</UserControl>

后台代码:

using System;

using System.IO;

using System.Net;

using System.ComponentModel;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Navigation;

namespace Sample

{

public partial class NumericControl : INotifyPropertyChanged

{

private double numericValue = 0;

public NumericControl()

{

this.InitializeComponent();

}

public double Value

{

get { return numericValue; }

set

{

numericValue = value;

NotifyPropertyChanged("Value");

}

}

public double Increment { get; set; }

public double MaxValue { get; set; }

public double MinValue { get; set; }

private void UpButton_Click(object sender, RoutedEventArgs e)

{

double newValue = (Value + Increment);

if (newValue > MaxValue)

{

Value = MaxValue;

}

else

{

Value = newValue;

}

}

private void DownButton_Click(object sender, RoutedEventArgs e)

{

double newValue = (Value - Increment);

if (newValue < MinValue)

{

Value = MinValue;

}

else

{

Value = newValue;

}

}

private void ValueText_LostFocus(object sender, RoutedEventArgs e)

{

try

{

Value = double.Parse(ValueText.Text);

}

catch (Exception)

{

Value = 0;

}

}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

public void NotifyPropertyChanged(string propertyName)

{

if (PropertyChanged != null)

{

PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}

}

#endregion

}

[ValueConversion(typeof(double), typeof(string))]

public class DoubleValueConverter : IValueConverter

{

#region IValueConverter Members

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

{

try

{

return value.ToString();

}

catch (Exception)

{

return "0";

}

}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

{

try

{

return double.Parse((string)value);

}

catch (Exception)

{

return 0;

}

}

#endregion

}

}

要点:

1.  灵活使用布局控件是良好设计的关键。

2.  尽量使用设计器来完成大部分XMAL代码。

3.  这里的Value属性是double型的。

4.  用属性MaxValue,MinValue和Increment来控制最大值、最小值和增量。

5.  实现InotifyPropertyChanged接口,这样当属性Value的值改变时,能够通知与之绑定的ValueText控件。这样做的目的是实现数据的双向绑定。

6.  实现一个IvalueConverter接口的类DoubleValueConverter,用于为数据绑定进行格式转换。

7.  对错误的输入进行适当处理。

预览

将NumericControl放到一个Window或Page中,可以在属性管理器中设置MaxValue,MinValue和Increment,然后开始测试项目:

示例下载

更多请访问

http://sites.google.com/site/sistudiodev/
http://blog.163.com/tianshi_17th/

http://blog.163.com/tianshi_17th/blog/static/48564189200917337274/

WPF控件NumericUpDown (转)的更多相关文章

  1. 《Dotnet9》系列-开源C# WPF控件库3《HandyControl》强力推荐

    大家好,我是Dotnet9小编,一个从事dotnet开发8年+的程序员.我最近开始写dotnet分享文章,希望能让更多人看到dotnet的发展,了解更多dotnet技术,帮助dotnet程序员应用do ...

  2. 浅尝辄止——使用ActiveX装载WPF控件

    1 引言 使用VC编写的容器类编辑器,很多都可以挂接ActiveX控件,因为基于COM的ActiveX控件不仅封装性不错,还可以显示一些不错的界面图元. 但是随着技术不断的进步,已被抛弃的Active ...

  3. XMAL语法系列之-(2)---WPF控件继承图

    WPF控件继承图 1 FrameworkElement 1.1 Panel(面板类元素) 1.1.1 Canvas 1.1.2 DockPanel 1.1.3 Grid 1.1.4 TabPanel ...

  4. 通过WinForm控件创建的WPF控件无法输入的问题

    今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子 ...

  5. WPF控件--利用Winform库中的NotifyIcon实现托盘小程序

    WPF控件--NotifyIcon   运行界面如下所示:            图1                                             图2 代码很少,如下所示 ...

  6. (转)WPF控件开源资源

    (转)WPF控件开源资源 Textbox Drag/Drop in WPFhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in- ...

  7. WPF控件模板

    引言:在进行WPF项目开发过程中,由于项目的需要,经常要对某个控件进行特殊的设定,其中就牵涉到模板的相关方面的内容.本文也是在自己进行项目开发过程中遇到控件模板设定时集中搜集资料后整理出来的,以供在以 ...

  8. 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件

    项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...

  9. 我的WPF控件库——KAN.WPF.XCtrl(141105)

    自己开发的WPF控件库,只是初版,有扩展的Button,TextBox,Window.详细参见前几篇博文. WPF自定义控件(一)——Button:http://www.cnblogs.com/Qin ...

随机推荐

  1. [Java学习] 再谈Java包

    在Java中,为了组织代码的方便,可以将功能相似的类放到一个文件夹内,这个文件夹,就叫做包. 包不但可以包含类,还可以包含接口和其他的包. 目录以"\"来表示层级关系,例如 E:\ ...

  2. 3-9《元编程》第3章Tuesday:methods

    第3章methods Ruby是动态语言,有静态语言实现不了的技巧.本章讲解代码的重构,把代码变得更简洁. 3.2Dynamic Methods 3.21Calling Methods Dynamic ...

  3. 广播 (Broadcast)

    广播 :在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.我们拿广播电台来做个比方.我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内 ...

  4. 在 Confluence 6 中连 Jira 的问题解决

    下面是可能会发生的一些错误信息.如果你的系统中出现了下面的一些提示,你应该调整你的日志错误级别到 WARN,然后查看具体的错误原因.请参考:Configuring Logging. error.jir ...

  5. AC自动机技巧

    AC自动机技巧 可以用树上的一些算法来进行优化 对于要求支持插入和删除字符串的题目,可以通过建两个AC自动机,查询的时候作差来实现. 当给出的查询串是一个含有空格的文本时,可以用特殊字符(比如'z'+ ...

  6. SQL Server 创建定时任务JOB

    1.    SQL Server 代理  → 作业(右键)→新建作业 2.在[常规]中输入 “名称” 并确认已勾选 “已启动”. 3.在[步骤]中 "新建步骤": 填写 “步骤名称 ...

  7. linux分析、诊断及调优的必备“杀器”之一

    下面分别列出linux分析.诊断及调优时用到的工具,并分别进行说明,以方便自己和其他同学参考学习,禁止转载. 1.top top - 02:06:59 up 4 days, 17:14, 2 user ...

  8. sql server中的大数据的批量操作(批量插入,批量删除)

    首先我们建立一个测试用员工表 ---创建一个测试的员工表--- create table Employee( EmployeeNo int primary key, --员工编号 EmployeeNa ...

  9. httpclient http状态管理

    HTTP状态管理 最初,Htt被设计成一个无状态的面向请求响应的协议,所以它不能再逻辑相关的http请求/响应中保持状态会话. 由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统 ...

  10. mkfs.ext3 option

    mkfs.ext3 OPTIONS -b block-size Specify  the  size  of blocks in bytes.  Valid block-size values are ...