因为有时候需要定制化的控件,需要多个控件的组合及复杂功能的集成,这样可以考虑自定义用户控件。下面分享一个简单的数值增减功能的自定义控件作为说明。

效果图如下:

1、创建自定义用户控件(添加->新建项->用户控件)

2、编写XAML

<UserControl x:Class="XXX.自定义控件.MyNumericUpDown"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:XXX.自定义控件"
mc:Ignorable="d"
d:DesignHeight="" d:DesignWidth="">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="40*"/>
<ColumnDefinition Width="40*"/>
</Grid.ColumnDefinitions> <TextBox Name="TextBox_Num" Grid.Column="" Text="" FontSize="" TextAlignment="Center" MinWidth="" VerticalContentAlignment="Center"/>
<Button Name="Button_Add" Grid.Column="" Content="加" Click="Button_Add_Click" Background="Aqua"/>
<Button Name="Button_Sub" Grid.Column="" Content="减" Click="Button_Sub_Click" Background="Aqua"/> </Grid>
</UserControl>

UI比较简单,我就不解释了...

2、编写后台代码

 /// <summary>
/// MyNumericUpDown.xaml 的交互逻辑
/// </summary>
public partial class MyNumericUpDown : UserControl
{ /// <summary>
/// 当前值
/// </summary>
public int Num
{
get
{
int value = ;
this.Dispatcher.Invoke(new Action(() =>
value = Convert.ToInt32(this.TextBox_Num.Text.Trim())
));
return value;
}
set
{
this.Dispatcher.Invoke(new Action(() =>
{
this.TextBox_Num.Text = value.ToString();
}));
}
} public MyNumericUpDown()
{
InitializeComponent();
} private void Button_Add_Click(object sender, RoutedEventArgs e)
{
int num = int.Parse(this.TextBox_Num.Text.Trim());
if (num > )
{
this.TextBox_Num.Text = (num + ).ToString();
}
} private void Button_Sub_Click(object sender, RoutedEventArgs e)
{
int num = int.Parse(this.TextBox_Num.Text.Trim());
if (num > )
{
if ((num - ) == )
return;
this.TextBox_Num.Text = (num - ).ToString();
}
}
}

逻辑也比较简单,两个按键的点击事件,每次加一或减一。值得说明的是公开的属性(该例只有一个公开属性就是控件的数值Num),属性需要进行读写器的包装,读取器和设置器操作控件TextBox时最好需要Invoke回调UI线程进行操作,否则其他线程操作时就会报错(当然也可以在外部Invoke)。

3、控件调用

用户控件继承UserControl,UserControl继承于ContentControl,所以可以和一般控件一样调用,但是由于命名空间不一致,需要声明命名空间。

xmlns:z="clr-namespace:XXX.自定义控件"  //Windows标签中声明命名空间
<z:MyNumericUpDown x:Name="MyNumericUpDown_PageNum" Width="" Height=""></z:MyNumericUpDown>

其实最好可以把对外需要进行数据绑定的属性写成依赖项属性,这样就能拥有依赖项属性的特点(如绑定),不过比较复杂,下次再具体说明。

最新文章

  1. bzoj3380+3381+3382+3383 Usaco2004 Open
  2. 掌握Thinkphp3.2.0----连贯操作
  3. 2.4 C#的变量
  4. c++初步实现的一个LRU
  5. 黑马程序员——【Java基础】——正则表达式
  6. 下载和使用 Open XML PowerTools
  7. Data Flow -&gt;&gt; Fuzzy Lookup &amp; Fuzzy Grouping
  8. CacheView。
  9. Convert Windows 32bit dirver to Windows 64bit
  10. Controller里写自己需要的Action,参数的名字必须和路由设置的参数名一致
  11. 基于lucene.net 和ICTCLAS2014的站内搜索的实现1
  12. python调用函数超时设置
  13. mvn -N和-U的用法
  14. 使用Chrome开发者工具远程调试原生Android上的H5页面
  15. CentOS 建立本地yum源服务器
  16. LeetCode(18):四数之和
  17. xdebug安装方法
  18. Java火焰图在Netflix的实践
  19. VS2015 安装XAN
  20. PyQt5 笔记(01):嵌套布局

热门文章

  1. 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)
  2. Java 面试宝典!并发编程 71 道题及答案全送上!
  3. 自学_数据库&lt;三&gt;
  4. java学习第一步-工欲善其事必先利其器
  5. Android Gradle 学习笔记(三):Gradle 日志
  6. presentViewController底部弹框适配ipad
  7. MySQL数据库:排序及limit的使用
  8. Android实现九宫拼图过程记录
  9. 机器学习(1)——K近邻算法
  10. LRU hashMap(拉链) + 双向链表 java实现