简单易学 图文并茂 VB制作WPF自定义控件 范例1

简单易学 图文并茂 VB制作WPF自定义控件 范例1
简单易学 图文并茂 VB制作WPF自定义控件 范例1

简单易学图文并茂

https://www.360docs.net/doc/1616053038.html,创作控件

自己创作控件,分三种主要的形式:复合控件,扩展控件,和自定义控件。

复合控件,顾名思义就是把现有的进行组合,让它们协作形成功能强大的新控件;

扩展控件,是以某一现有控件为基础,让它具有新的功能;自定义控件,则是由作者完全操刀,建立一个全新的控件。

可以用一个比喻来理解这三种形式的区别:复合控件,就是你买好各个电脑配件,组装成一台电脑;扩展控件,就是把显卡上的零件更换几个,让它能力比标准产品更强大;自定义控件,就是自己制作一个名为“生人勿近”的硬件,他可以通过PCI插槽,安装到电脑上,一旦生人走近,它能识别并发出狗叫……

综上,三种形式中,复合控件相对来说是最简单的;扩展控件在其次;自定义控件最难。通常,我们使用前两种技术,就能创作出很复杂的控件了。

范例1:

Excel的单元格Cell,当它没有焦点的时候,就是一个TextBlock,当它获得焦点,可以编辑的时候,就是一个TextBox框。这样一个控件,将是我们今后制作表格控件的基础。范例1中,我们会用到两种技术,复合控件和扩展控件。

在VS中,要进行如下的工作(推荐使用VS2010)

1.新建一个Solution,名为Cell;

2.添加一个名为“TestAPP”的WFP项目。我们用他来测试成果;

3.添加一个名为“Ctrl_Cell”的WFP用户控件项目。

然后,我们需要一个TextBlock,和一个TextBox控件,这是我们的演员。

考虑一下它们应该怎样演出,才能达到我们需要的效果:

●平时这个控件,应该表现出TextBlock的外观;

●当我们点击这个Label时,隐藏的TextBox控件跑到TextBlock的前面,并且它显示的值

和TextBlock一样。同时,这个值是可以编辑的;

●编辑完TextBox的内容,按下Enter,或者点击屏幕上的其他控件,让TextBox失去焦点,

TextBox消失。TextBlock跑到前面来,并且显示编辑后的内容。

接着,需要考虑一下这个控件的属性和事件。

1.它应该有一个Value属性,Label显示这个Value;同时Text也显示这个Value;我们编

辑的时候,也是针对这个Value。

2.点击TextBlock时,会发生一系列的变化。所以我们要关注TextBlock的MouseDown事

件。

3.编辑TextBox,按下Enter后,或者TextBox失去焦点,会发生一系列的变化。所以我们

要关注TextBox接受了Enter键这个输入,同时也要关注它的LostFocus事件。

关于“TextBox控件接受到一个Enter输入”的问题。基础的TextBox控件是没有这个功能的,而我们今后要用到的地方很多。所以我考虑扩展一下TextBox的功能,制作一个Ex_TextBox。新的控件在用户按下Enter的时候,产生一个getEnterKey的事件,这样使用者就能处理这条消息了。

扩展现有控件,直接在原有的TextBox上继承,把一个判断键盘输入值的程序afterGetEnter绑定到Keydown事件下。

在Ctrol_Cell项目下,添加一个新的类,名为Ex_TextBox。

*******************代码********************

Public Class Ex_TextBox

Inherits TextBox

'这个控件扩展了现有TextBox的功能。

'当用户输入Enter的时候,引发一个getEnterKey事件。

'这样,控件的使用者,就能在输入Enter的时候,得到一个信息。

'扩展控件功能,属于创作控件的第二种技术。

Public Event getEnterKey As EventHandler

Private Sub afterGetEnter(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown

If e.Key = Key.Enter Then

RaiseEvent getEnterKey(sender, e)

End If

End Sub

End Class

*******************代码********************

如此,用户按下Enter后,Ex_TextBox就发出一个getEnterKey事件。使用者今后编写响应这个事件的代码就可以了。

最后,我们在Cell的UI上,添加一个TextBlock和一个Ex_TextBox。其UI代码如下:*******************代码********************

xmlns="https://www.360docs.net/doc/1616053038.html,/winfx/2006/xaml/presentation"

xmlns:x="https://www.360docs.net/doc/1616053038.html,/winfx/2006/xaml"

xmlns:mc="https://www.360docs.net/doc/1616053038.html,/markup-compatibility/2006"

xmlns:d="https://www.360docs.net/doc/1616053038.html,/expression/blend/2008"

mc:Ignorable="d"

d:DesignHeight="300" d:DesignWidth="182" Height="23" xmlns:my="clr-namespace:Ctrl_Label_Text">

*******************代码********************

控件的外观如下:

要添加Value属性,并描述控件的行为,还需要添加一些代码:

*******************代码********************

Public Class Ctrl_Cell

Private p_value As String '这是Cell的Value属性

Public Property Value As String

Get

Return Me.p_value

End Get

Set(ByVal value As String)

Me.p_value = value

Me.TextBlock1.Text = value

End Set

End Property

Private Sub ShowExTextBox(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBlock1.MouseDown

'把显示Ex_TextBox的动作,和点击TextBlock事件绑定起来

Me.Ex_TextBox1.Visibility = Windows.Visibility.Visible

Me.TextBlock1.Visibility = Windows.Visibility.Hidden

Me.Ex_TextBox1.Focus()

End Sub

Private Sub MyInit()

'把显示TextBlock的动作,和Ex_Textbox得到Enter,以及失去焦点这两个事件绑定起来

AddHandler Ex_TextBox1.getEnterKey, AddressOf Me.ShowTextBlock

AddHandler Ex_TextBox1.LostFocus, AddressOf Me.ShowTextBlock

End Sub

Private Sub ShowTextBlock(ByVal sender As Object, ByVal e As System.EventArgs) '这是从Ex_TextBox切换到TextBlock的动作

Me.TextBlock1.Visibility = Windows.Visibility.Visible

Me.Value = Me.Ex_TextBox1.Text

Me.Ex_TextBox1.Visibility = Windows.Visibility.Hidden

End Sub

Public Sub New()

' 此调用是设计器所必需的。

InitializeComponent()

' 在InitializeComponent() 调用之后添加任何初始化。

Me.MyInit() '调用自己的初始化代码

End Sub

End Class

*******************代码********************

这样,Cell的设计就完成了。在TestAPP中测试一下:

在UI上放一个Cell控件。并添加一个按钮:

按钮查看Cell的Value,代码如下:

*******************代码********************

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click

MsgBox(Me.Cell1.Value)

End Sub

*******************代码********************

当Cell没有点击的时候,它是一个TextBlock;点击它,变成一个TextBox,可以接受用户的输入;修改内容并按下Enter后,切换回TextBlock,内容也修改了;修改内容,直接点

击旁边的按钮,也能切换回TextBlock;按钮显示的是Cell的值。

总结一下:

控件是接受用户输入的,因此用户有哪些动作,需要逐一分析,并逐一响应;

控件变换,无论前后切换,或者弹出等(例如点击一个按钮,跳出一个菜单,可以用按钮+ListBox),都可以用基础控件组合而实现。这比完全自定义控件要简单很多,因为你不用手工绘制它们。

在现有基础控件上添加控制功能,最好的办法是把代码绑定到相关事件上,并引发一个新事件。这样控件相当于向外界公布了一个新的信息,外界程序就能进行响应了。通过事件来传递信息,是非常安全和便捷的。制作复杂控件,必须深入理解这个技术。在后面的章节中,我们还会不断提到它。

wpf自定义slider控件

自定义Slider控件 最终效果: 界面: