WPF控件NumericUpDown (转)

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 (转)

时间: 2024-10-14 00:51:48

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

WPF 控件与布局

[控件到底是什么?] 程序的本质就是"数据+算法"------用户输入原始的数据,算法处理原始数据并得到结果数据.问题就在于程序如何将结果数据显示给用户.同样一组数据,你可以使用LED阵列显示出来,或者以命令行模式借助各种格式控制符(如TAB)对齐并输出,但这些都不如图形界面(GUI  Graphic User Interface)来的友好和方便.GUI的方便在于它对数据展示的直观性,程序员可以通过编程的方式将数据通过图形的方式展示出来,从而避免了用户面对一大堆复杂数据的痛苦.提高了工

WPF 控件之 Popup

1.常用属性说明 IsOpen: 布尔值,指示 Popup 控件是否显示 StaysOpen: 布尔值,指示在 Popup 控件失去焦点的时候,是否关闭 Popup 控件的显示 PopupAnimation:指示显示窗口时是否使用动画,只有在 AllowsTransparency 等于true时此属性才有用 Popup 窗口本身是一个不可见的元素,只有在窗口上放置了信息后才能显示 Popup的定位方式与一般控件的定位方法不一样, Popup 使用五个属性来设定位置信息: PlacementTar

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

今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子后,终于找到了原因:虽然这个程序是个WPF程序,但为了复用之前的部分代码,使用着一个WinForm的菜单控件,后续的子窗口都是通过这个WinForm菜单创建的.而用WinForm控件创建的WPF控件可能出现无法正确响应键盘事件的情况. 找到了原因后,一个常规的解决方法是:将WinForm控件换成WP

WPF控件到图片的转换

在实际的项目开发中,经常需要将信息保存成图片的形式,如屏幕截图.地图快照等操作,我中最近一个项目中便有这样的需求,项目(WPF)中用到GMap.NET控件,中地图上展示一些信息,过程中可能用户需要将地图信息保存下来,也就是地图快照,我的界面如下所示: 网上查了GMap相关的资料,没有找到GMap怎么截图的方法,最后找到网友提供的方法:将WPF控件转换成图片. 具体实现如下: namespace QACDR2.Common { internal enum ImageType { Bmp, Gif,

WPF控件自绘——基础,Control类的定义

用于记录自己的学习WPF控件,大神请飘过... [WPF控件类继承关系图] 所有可以自定义模版的控件都是从Control继承,所以我们来看看Contorl类里面到底有些什么.为以后的控件自定义模版做好准备.废话少说先来看看WPF中Control类的定义 1 namespace System.Windows.Controls 2 { 3 public class Control : FrameworkElement 4 { 5 public static readonly DependencyPr

wpf控件开发基础

wpf控件开发基础(3) -属性系统(2) http://www.cnblogs.com/Clingingboy/archive/2010/02/01/1661370.html 这个有必要看看

WINFORM中加入WPF控件并绑定数据源实现跨线程自动更新

1. WINFORM中添加两个ElementHost,一个放WPF的Button,一个放WPF的TextBox.其中TextBox与数据源绑定,实现跨线程也可以自动更新,而不会出现WINFORM的TextBox控件与数据源绑定后,存在子线程中更新数据源报错(跨线程更新控件)的情况. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System

跟我一起学WPF(3):WPF控件基础

WPF控件简介 通过上一篇XAML语言的介绍,我们知道,XAML是一个树形结构,同样,WPF控件作为构成整个XAML树的一部分,也是一个树形结构.我们看一个简单的例子. <Button.Content> <DockPanel> <Image Source="F:\01.Code\01.MyCode\WpfApplication1\WpfApplication1\Resources\荷.jpg" Width="30"/> <T

WPF学习系列之五(WPF控件)

控件:    1.内容控件------这些控件能够包含嵌套的元素,为它们提供几乎无限的显示能力.内容控件包括Lable,Button 以及ToolTip类. 内容控件是更特殊的控件类型,它们可以包含(并显示)一块内容.从技术角度来讲,内容控件是可以包含单个嵌套元素的控件.与布局容器不同的是内容控件只能包含一个子元素,而布局控件只要愿意可以包含任意多个嵌套元素.              提示:当然,仍然可以在单个内容控件中放置大量内容-----诀窍是使用单个容器,比如,使用StackPanel面