2009年7月20日

为自定义控件添加自定义事件

  事件,委托,总是看起来有点绕,不过本文不介绍这些,只说说如何为自定义控件添加自定义事件。

  本文所说的自定义控件,非继承其他现有Microsoft控件或者组合控件,而是完全继承UserControl的东西。

  既然不是继承自其他现有控件或者控件组合,在特定需求下,有添加自定义事件的可能性,或者对继承自UserControl而得到的事件进行些许扩展,以期以简便的方式得到更丰富的信息等等。

  下面简单介绍2个例子,有用之人作为参考,大拿级别的,ignore吧。

  例1. 添加完全自定义事件。

  需求:

  假设客户端(指添加了自定义控件的窗体等等)想知道用户是否在控件上按下的Shift键(当然,可以通过KeyPress之类的事件来判断,没必要再自己整个事件,例子只是个例子),控件作者想通过一个特殊的方式来进行判断,这就可以选择自定义事件。

  好吧,起个名字,叫Custom,需要客户端在触发Custom时得到一个布尔属性Flag来判断用户是否按下Shift。

  按部就班:

  (1)创建事件

        // 创建事件
        public event CustomEventHandler Custom;

  有问题,CustomEventHandler是什么,当然,这里需要一个委托,于是还是搞定这个委托

  (2)定义委托

    // 定义委托
    public delegate void CustomEventHandler(object sender, CustomEventArgs e);

  CustomEventHandler搞定了,又有新问题:CustomEventArgs是啥,其实需要CustomEventArgs来获得你需要的数据,CustomEventHandler,于是还要定义个CustomEventArgs(这个东西必须继承自System.EventArgs),在CustomEventArgs里面定义需要的数据属性:
(3)定义EventArgs

    // 自定义EventArgs,并添加自定义属性【Flag】
    public sealed class CustomEventArgs : EventArgs
    {
        private bool testFlag;
        public CustomEventArgs(bool testFlag)
        {
            this.testFlag = testFlag;
        }
        public bool Flag
        {
            get { return testFlag; }
        }
    }

  有了CustomEventArgs,以后在触发事件之后便可以从e.Flag中得到数据。

  事件定义完了,这下看看效果先:

为自定义控件添加自定义事件

  图片看不清楚?请点击这里查看原图(大图)。

  能看到在属性窗口中已经能见到Custom事件

  可是Custom到底是怎么执行和在控件内部触发的呢,想破头~

  (4)执行事件的代码

  需要一个OnCustom来完成任务

       // 执行事件
        protected virtual void OnCustom(CustomEventArgs e)
        {
            if (Custom != null)
            {
                Custom(this, e);
            }
        }
 
Custom(this, e);

 

  来完成调动客户端的任务,现在问题的关键就在于在合适的地方执行一下OnCustom就可以了,在何处执行,全看你需要的数据在什么地方能后取得或者发生变化,本例简单点,就在控件本身的KeyDown事件里面好了:

  (5)何处执行OnCustom

        // 触发事件处
        private void MyControl_KeyDown(object sender, KeyEventArgs e)
        {
            // 此处省略无关代码。。。
 
            // 客户端按下Shift键与否
            bool testFlag = e.Shift;
            CustomEventArgs eArgs = new CustomEventArgs(testFlag);
            // 触发事件
            OnCustom(eArgs);
 
            // 此处省略无关代码。。。
        }

  至此算基本完成,看下最终效果

为自定义控件添加自定义事件

  图片看不清楚?请点击这里查看原图(大图)。

  在测试窗体上使用自定义控件的Custom事件

  例2.对原有事件进行一定扩展,并覆盖原事件

  需求:

  想在KeyPress中再多获得一些数据,起个名字:KeyAscii,但是KeyPress中没有这个,那就自定义一个CustomKeyPress,不用KeyPress,并使其在客户端隐藏

  隐藏的办法:

        // 屏蔽KeyPress事件使其在客户端不可见
        [Browsable(false)]
        public new event KeyPressEventHandler KeyPress;

 以后跟例一差不多了,

  创建事件,委托:

        // 创建事件CustomKeyPress替代KeyPress
        public event CustomKeyPressEventHandler CustomKeyPress;
    // 定义委托
    public delegate void CustomKeyPressEventHandler(object sender, CustomKeyPressEventArgs e);
CustomKeyPressEventArgs要继承自KeyPressEventArgs,而System.Windows.Forms.KeyPressEventArgs其实继承自System.EventArgs
   // 自定义KeyPressEventArgs,并添加自定义属性【KeyAscii】
    public sealed class CustomKeyPressEventArgs : KeyPressEventArgs
    {
        private Int32 keyAscii;
        public CustomKeyPressEventArgs(Int32 keyAscii) : base((char)keyAscii)
        {
            this.keyAscii = keyAscii;
        }
        public Int32 KeyAscii
        {
            get { return keyAscii; }
        }
    }

  触发事件处:

        // 触发事件处
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (CustomKeyPress != null)
            {
                CustomKeyPressEventArgs eArgs = new CustomKeyPressEventArgs(e.KeyChar);
                CustomKeyPress(this, eArgs);
            }
            base.OnKeyPress(e);
        }

 

  需要特别注意的是,KeyPress被隐藏之后,控件本身的KeyPress事件也将不能被触发

  OK....



 

posted @ 2009-07-20 15:07 wmt 阅读(367) 评论(0) 编辑

2009年3月25日

如何在 XAML 中定义 ControlTemplate

如何在 XAML 中定义 ControlTemplate

 

<StackPanel>
  <StackPanel.Resources>
    <Style x:Key="ButtonStyle" TargetType="Button">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="Button">

            <!--Define the ControlTemplate here.-->

          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </StackPanel.Resources>
  <Button Style="{StaticResource ButtonStyle}" Content="Button1"/>
</StackPanel>

posted @ 2009-03-25 17:09 wmt 阅读(30) 评论(0) 编辑

2009年3月22日

鼠标拖拽过程

单击鼠标时    

 '得到需要拖拽的对象 ,修改此处   

Dim item As Rectangle = sender
        '获取鼠标当前位置
        mouseVerticalPosition = e.GetPosition(Nothing).Y
        mouseHorizontalPosition = e.GetPosition(Nothing).X
        '启用鼠标捕获
        isMouseCaptured = True
        '将鼠标捕获设置为 UIElement
        item.CaptureMouse()

 

移动鼠标时

 

松开鼠标时

 

 

Private Sub RectAClick(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
        '若已经处理过, 则不处理
        e.Handled = True
        Me.statusTextBlock.Text = "x:y=" & e.GetPosition(Me.ParentCanvas).ToString & ".RectA is Click,not BubbleUp"
    End Sub

    Dim isMouseCaptured As Boolean
    Dim mouseVerticalPosition As Double
    Dim mouseHorizontalPosition As Double

    Private Sub Rect_Handle_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
        Dim item As Rectangle = sender
        '获取鼠标当前位置
        mouseVerticalPosition = e.GetPosition(Nothing).Y
        mouseHorizontalPosition = e.GetPosition(Nothing).X
        '启用鼠标捕获
        isMouseCaptured = True
        '将鼠标捕获设置为 UIElement
        item.CaptureMouse()
    End Sub

    Private Sub Rect_Handle_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseEventArgs)
        Dim item As Rectangle = sender
        If (isMouseCaptured) Then
            ' 计算对象的当前位置
            Dim deltaV As Double = e.GetPosition(Nothing).Y - mouseVerticalPosition
            Dim deltaH As Double = e.GetPosition(Nothing).X - mouseHorizontalPosition
            Dim newTop As Double = deltaV + item.GetValue(Canvas.TopProperty)
            Dim newLeft As Double = deltaH + item.GetValue(Canvas.LeftProperty)

            ' 设置对象新位置
            item.SetValue(Canvas.TopProperty, newTop)
            item.SetValue(Canvas.LeftProperty, newLeft)

            ' Update position global variables.
            mouseVerticalPosition = e.GetPosition(Nothing).Y
            mouseHorizontalPosition = e.GetPosition(Nothing).X
        End If

    End Sub

    Private Sub Rect_Handle_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
        Dim item As Rectangle = sender
        isMouseCaptured = False
        item.ReleaseMouseCapture()
        mouseVerticalPosition = -1
        mouseHorizontalPosition = -1
    End Sub

 

 

 

posted @ 2009-03-22 00:31 wmt 阅读(99) 评论(0) 编辑

2009年3月15日

博客园插入silerlight

<object type="application/x-silverlight-2" height="480" width="640">
<param name="source" value="http://Files.cnblogs.com/wmt1708/SilverlightApplication20.xap"     />
</body>
</html>
</object>

posted @ 2009-03-15 22:04 wmt 阅读(31) 评论(0) 编辑

2009年3月7日

SilverLight下载任意文件技巧

xaml采用LinkButton 其NavigateUri属性链接到服务端下载的ashx文档

<HyperlinkButton Margin="32,135,198,140" Content="HyperlinkButton" NavigateUri="http://localhost:1399/download.ashx" />

 

download.ashx如下

 

Code

posted @ 2009-03-07 00:05 wmt 阅读(1412) 评论(1) 编辑

2009年3月5日

asp.net下载文件的常用方法大全

posted @ 2009-03-05 23:26 wmt 阅读(94) 评论(0) 编辑

2009年3月4日

为Silverlight控件添加鼠标滚轮支持的小类

posted @ 2009-03-04 11:44 wmt 阅读(64) 评论(0) 编辑

2009年3月3日

Silverlight中的全屏相关.

posted @ 2009-03-03 18:52 wmt 阅读(16) 评论(0) 编辑

2009年2月24日

C#跨线程操作控件

posted @ 2009-02-24 09:23 wmt 阅读(631) 评论(0) 编辑

2009年2月19日

绑定的资源 然后去排序

posted @ 2009-02-19 08:45 wmt 阅读(18) 评论(0) 编辑

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:wmt
园龄:3年1个月
粉丝:1
关注:0

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

文章分类

相册

最新评论

阅读排行榜

评论排行榜

推荐排行榜