精通Silverlight——12.5.4 添加控件事件

本文介绍如何创建自定义WPF控件MyLabel,并为其添加单击事件及超链接效果。通过定义事件、触发事件及实现相关处理函数,实现控件的交互功能。

为控件添加事件可以分为如下所示的三步:

q      定义事件。

q      触发事件。

为了给MyLabel控件添加单击事件,需要先声明一个Click事件,代码如下:

        public event EventHandler Click;

当用户在文本上单击鼠标左键后,便触发事件,只需要在MouseLeftButton被触发时触发事件即可,代码如下所示:

         //TextBox的鼠标左键按下时,触发事件。

        protected void MyLabel_MouseLeftButtonDown(object sender, MouseEventArgs e)

        {           

            RaiseClick();

        }

        //触过事件的函数

        private void RaiseClick()

        {

            if (Click != null)

            {

                Click(this, null);

            }

        }

代码中为触发事件定义了RaiseClick函数,在MouseLeftButtonDown事件中处理了此函数。最后,为MyLabel添加超级链接特效,完整的控件代码如下所示:

using System;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.IO;

using System.Reflection;

namespace mySampleControls

{

    public class MyLabel : Control

    {

        #region 私有数据区

        TextBlock tb;

        FrameworkElement implementationRoot;

        SolidColorBrush sb;

        #endregion

        #region 构造函数

        public MyLabel()

        {

            //获取当前程序集实例

            Assembly asm = this.GetType().Assembly;

            //获取程序集的资源清单,注意xaml的命名。

            Stream s = asm.GetManifestResourceStream("mySampleControls.MyLabel.xaml");

            //调用InitializeFromXaml初始化控件树。

            implementationRoot = this.InitializeFromXaml(new StreamReader(s).ReadToEnd());

            //获取在Xaml中定义的TextBlock控件

            tb = implementationRoot.FindName("tb") as TextBlock;

            //定义加载事件

            this.Loaded += new EventHandler(MyLabel_Loaded);

            //指定宽和高

            base.Width = implementationRoot.Width;

            base.Height = implementationRoot.Height;

            tb.MouseLeftButtonDown += new MouseEventHandler(MyLabel_MouseLeftButtonDown);

            tb.MouseEnter += new MouseEventHandler(tb_MouseEnter);

            tb.MouseLeave += new EventHandler(tb_MouseLeave);

        }

        void tb_MouseLeave(object sender, EventArgs e)

        {

            tb.TextDecorations = TextDecorations.None;

        }

        void tb_MouseEnter(object sender, MouseEventArgs e)

        {

            tb.TextDecorations = TextDecorations.Underline;

        }      

        #endregion

        void MyLabel_Loaded(object sender, EventArgs e)

        {

            UpdateLayout();

        }

        #region 公共属性

        //定义控件的宽度

        public virtual new double Width

        {

            get

            {

                return implementationRoot.Width;

            }

            set

            {

                implementationRoot.Width = value;

                UpdateLayout();

            }

        }

        //定义控件的高度

        public virtual new double Height

        {

            get

            {

                return implementationRoot.Height;

            }

            set

            {

                implementationRoot.Height = value;               

                UpdateLayout();

            }

        }

        //定义控件的文本设置属性

        public String Text

        {

            get

            {

                return tb.Text;

            }

            set

            {

                tb.Text = value;

                UpdateLayout();

            }

        }

        //定义控件的颜色

        public SolidColorBrush LabelColor

        {

            get

            {

                return (SolidColorBrush)tb.Foreground;               

            }

            set

            {

                tb.Foreground = (SolidColorBrush)value;

            }

        }

        //定义控件的背影颜色

        public SolidColorBrush BackColor

        {

            get

            {

                return (SolidColorBrush)((Canvas)implementationRoot).Background;

            }

            set

            {

                ((Canvas)implementationRoot).Background= (SolidColorBrush)value;

                UpdateLayout();

            }

        }

        #endregion

        #region 公共事件

        public event EventHandler Click;

        #endregion

        //TextBox的鼠标左键按下时,触发事件。

        protected void MyLabel_MouseLeftButtonDown(object sender, MouseEventArgs e)

        {           

            RaiseClick();

        }

        //触过事件的函数

        private void RaiseClick()

        {

            if (Click != null)

            {

                Click(this, null);

            }

        }

        //更新布局

        protected void UpdateLayout()

        {

            tb.SetValue(Canvas.LeftProperty, (Width - tb.ActualWidth) / 2);

            tb.SetValue(Canvas.TopProperty, (Height - tb.ActualHeight) / 2);

        }

   

    }

}

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值