WPF自定义控件的制作

摘要:
因为有时需要定制控件,这需要多个控件的组合和复杂功能的集成。这样,可以考虑用户定义的用户控件。这里是一个简单的用户定义的值增加/减少功能控件。

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

效果图如下:

WPF自定义控件的制作第1张

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

WPF自定义控件的制作第2张

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="30" d:DesignWidth="120">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="40*"/>
            <ColumnDefinition Width="40*"/>
        </Grid.ColumnDefinitions>

        <TextBox Name="TextBox_Num" Grid.Column="0" Text="1" FontSize="20" TextAlignment="Center" MinWidth="40" VerticalContentAlignment="Center"/>
        <Button Name="Button_Add" Grid.Column="1" Content="" Click="Button_Add_Click" Background="Aqua"/>
        <Button Name="Button_Sub" Grid.Column="2" 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 = 0;
                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 > 0)
            {
                this.TextBox_Num.Text = (num + 1).ToString();
            }
        }

        private void Button_Sub_Click(object sender, RoutedEventArgs e)
        {
            int num = int.Parse(this.TextBox_Num.Text.Trim());
            if (num > 0)
            {
                if ((num - 1) == 0)
                    return;
                this.TextBox_Num.Text = (num - 1).ToString();
            }
        }
    }

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

3、控件调用

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

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

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

免责声明:文章转载自《WPF自定义控件的制作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt笔记(二)linux下Qt安装使用扩展LLVM:添加指令、内部函数、类型等下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【XStream】xml和java实体的相互转化

1.pom.xml <!-- xstream xml和Java对象转化 --> <dependency> <groupId>xstream</groupId> <artifactId>xstream</artifactId...

微信公众平台开发尝试

最近看了一篇博文是说微信公众平台搭建,于是心血来潮自己也尝试了一下。 1.不用多讲了,申请微信公众号,对于个人来说,只能申请订阅号。 可以看这个链接的文章,http://jingyan.baidu.com/article/414eccf6011ff06b431f0aec.html 2.采用的是Sina App Engine来脱管服务,就要申请sae开发者权...

WPF使用Winform PDFView控件

最近开发wpf项目中有一个模块需要显示PDF文件内容。由于WPF本身没有PDF加载控件(似乎有收费的我查到过类似的资料。如果有新的pdf控件也请通知我一下谢谢)。 项目使用之前也是从网上获取的资料,因此接下来的控件命名和项目命名完全沿用原文档。具体地址忘记了。这样也好感谢原作者。 不过里面的逻辑根据项目实际应用做了变工 。每人理解不同为了大家更快更好地的使...

整体二分

关于整体二分的学习其实只是了解了普通二分之后自然就懂了整体二分了。没有很难但是基于整体二分是基于时间和值域的分治。 比CDQ要更强一点。因为可以在一些离线的题目当中代替树套树什么的。 同时也非常的好写 。至少代码好懂。 首先是值域上的二分 这个二分是分离不同的值毕竟不同的值在不同的区间之内。我们可以将其二分。但是单次二分也是可以得到整体的信息的不妨把所有的...

Effective C++学习笔记(一)

条款一 C++是一个语言联邦 建议 c++是有兄弟的:C,Object-Oriented c++(c with class),template c++,STL c++高效编程守则视状况而变化,取决于你使用c++的哪一部分。 条款二 尽量使用const, enum, inline代替define。 宁可编译器替换预处理器比较好。因为define不被视为...

使用TPU在PyTorch中实现ResNet50

作者|DR. VAIBHAV KUMAR 编译|VK 来源|Analytics In Diamag PyTorch通过提供大量强大的工具和技术,一直在推动计算机视觉和深度学习领域的发展。 在计算机视觉领域,基于深度学习的执行需要处理大量的图像数据集,因此需要一个加速的环境来加快执行过程以达到可接受的精度水平。 PyTorch通过XLA(加速线性代数)提供了...