精华内容
下载资源
问答
  • 控件中一些常用的属性和事件
    千次阅读
    2019-09-01 11:22:56

    1.1常用基本属性

    1)Name:表示控件的名称。
    2)Enabled:表示控件是否可以对用户交互做出响应。
    3)Font:表示控件中显示文字的字体格式,包括字体名称、字号以及是否以斜体、加粗和下划线显式。
    4)BackColor:表示控件的背景色。
    5)ForeColor:表示控件的前景色。
    6)Image:表示控件上显示的图片。
    7)Location:这是一个复合属性,表示控件的左上角相对于其容器的左上角的坐标。
    8)Size:这是一个复合属性,表示控件的高度和宽度。
    9)Visible:表示是否显示控件。

    1.2常用事件

    1)MouseEnter事件:鼠标进入控件区域内时触发。
    2)MouseDown事件:在控件区域内按下鼠标键时触发。
    3)MouseLeave事件:鼠标离开控件区域时触发。
    除了上面提到的一些常用基本属性和事件以外,每个控件还有一些适合自己特点的属性和事件,现分别介绍如下。
    2 Label控件和LinkLabel控件
    Label控件通常用于提供控件或窗体的描述性文字,以便为用户提供帮助信息。
    2.1Label控件常用的基础属性
    Text:表示显式的文本内容。

    2.2操作示例

    下面这个示例主要反映如何在窗体中放置控件,以及设置控件属性。
    【例】标签示例
    1)创建一个Windows应用程序项目,在“属性”窗口中将窗体form1的“Text”属性改为“基础控件”,设置窗体“Size”属性值为“352,240”。
    2)从工具箱中拖出Label控件到窗体中。
    3)选中窗体中的Label控件,查看“属性”窗口,看到其“Name”属性为“Label1”。
    4)设置“Text”属性值为“基础控件展示”;设置“Font”属性值为“宋体,小二号字,斜体”;设置“Location”属性值为“88,24”,设置“ForeColor”属性值为“Blue”。
    5)按键编译并执行。

    LinkLabel控件与Label控件非常相似,不同的是它可以显示超级链接。当用户点击LinkLabel控件时,会触发LinkClicked事件,可以在LinkClicked事件中编写代码链接到指定网页。假设窗体上有一个LinkLabel控件,其“Text”属性为“请单击访问微软中国主页”;“LinkArea”属性为“5,4”,意思是将第5个字符后的4个字符即“微软中国”作为链接区域。编写LinkLabel1_LinkClicked事件代码为:
    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
    this.linkLabel1.Links[0].LinkData = “https://www.microsoft.com/zh-cn”;
    System.Diagnostics.Process.Start(e.Link.LinkData.ToString());
    }
    执行该窗体,当用户单击“微软中国”时,就会显示相应的网页。
    3 Button控件
    一般使用Button控件完成某个处理过程。
    3.1 按钮控件中常用的基本属性
    Text属性:表示按钮控件上显示的文本内容。
    3.2 按钮控件中常用的基本事件
    Click事件:表示用鼠标单击控件时触发的操作。
    3.3 操作示例
    下面这个示例主要反映如何实现一些常用事件。
    【例】按钮示例
    1)从工具箱中拖动Button控件到窗体中。
    2)查看”属性“窗口,看到其”Name“属性为”button1“.
    3)设置”Text“属性值为”按钮测试“;设置”Location“属性值为”120,160“;设置”Size“属性值为”88,32“。
    4)实现Click事件。
    该事件的功能是当鼠标单击按钮时,会弹出一个消息框,同时修改标签属性。
    在属性窗口中,单击”事件“符号,在事件列表中找到”Click“事件,双击”Click“单元格,打开”代码编辑器“窗口,Visual C#.net会自动在From1.cs文件中加入以下代码:
    private void button1_Click(object sender, EventArgs e)
    {

        }
    

    其中,sender代表发出事件的对象,此处指button1;e代表封装的事件信息。在其中添加代码,其结果如下:
    private void button1_Click(object sender, EventArgs e)
    {
    //修改标签文本属性
    label1.Text = “请选择你的业余爱好”;
    //弹出一个消息对话框
    MessageBox.Show(this, “标签文本内容已修改”, “提示”, MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    5)实现MouseEnter事件。
    该事件的功能是当鼠标进入按钮区域时,按钮颜色变为白色。
    在时间列表中双击”MouseEnter“单元格,Visual C#.net会自动在Form1.cs文件中加入以下代码:
    private void button1_MouseEnter(object sender, EventArgs e)
    {

        }
    

    在其中添加代码,如下:
    private void button1_MouseEnter(object sender, EventArgs e)
    {
    button1.BackColor = System.Drawing.Color.White;
    }
    6)实现MouseLeave事件。
    该事件的功能是当鼠标离开按钮区域时,按钮恢复原来的颜色。
    添加MouseLeave事件,修改代码如下:
    private void button1_MouseLeave(object sender, EventArgs e)
    {
    button1.BackColor = System.Drawing.SystemColors.Control;
    }
    7)按键编译并执行。
    4 TextBox控件
    TextBox控件允许用户在应用程序中输入或编辑文本,包括多行编辑和密码字符屏蔽等。
    4.1 文本框控件中常用的基本属性
    1)Text属性:表示文本框中的当前文本。
    2)MaxLenght属性:表示用户可以在文本框控件中最多键入的字符数。
    3)Multiline属性:表示是否可以包含多行内容。
    4)PasswordChar属性:用于屏蔽在单行文本框控件中输入的密码字符。也就是说,如果指定了PasswordChar,则输入的任何字符都显示为PasswordChar中指定的字符。注意:如果将Multiline属性设置为true,则PasswordChar不起作用。
    4.2 文本框控件中常用的基本事件
    TextChanged事件:表示文本框当前内容(Text属性值)更改时触发的操作。
    4.3 操作示例
    该示例的功能是当用户输入密码时,标签label1的文本反映出该用户输入的密码。
    【例】文本框示例
    1)从工具箱中以此拖入Label和TextBox控件到窗体中。

    2)设置属性如下表

    控件 属性 值
    Label Name labelUser
    Text 用户名
    TextBox Name textBoxUser
    Label Name labelPwd
    Text 密码
    TextBox Name textBoxPwd
    PasswordChar *
    3)添加textBoxPwd_TextChanged事件代码。
    选中textBoxPwd控件,添加TextChanged事件,并修改代码如下:
    private void textBoxPwd_TextChanged(object sender, EventArgs e)
    {
    label1.Text = textBoxUser.Text + “输入的密码为” + textBoxPwd.Text;
    }
    4)按键编译并执行。

    5 CheckBox控件

    CheckBox控件可为用户提供一项选择,如“真/假”或“是/否”。该复选框控件可以显示一个图像或文本,或两者都显示。多个CheckBox控件构成一组选项时,可进行多重选择,相互之间不影响。
    5.1 复选框控件中常用的基础属性
    1)Text属性:表示与复选框控件关联的文本。
    2)Checked属性:表示复选框是否处于选中状态。
    5.2 复选框控件中常用的基本事件
    CheckedChanged事件:表示当Checked属性值更改时触发的操作。
    5.3 操作示例
    该示例的功能是当选中某个复选框时,该复选框的文字会变为绿色,单击按钮时会弹出消息反映用户的选择。3个CheckBox控件的CheckedChanged事件通过调用一个公用的方法checkBox_CheckedChanged来实现。
    【例】复选框示例
    1)在工程中添加一个新窗体form2。
    窗体中各控件属性如下:
    控件 属性 值
    Label Name label1
    Text 你的业余爱好是:
    CheckBox Name checkBox1
    Text 体育活动
    Checked False
    CheckBox Name checkBox2
    Text 逛商场
    Checked False
    CheckBox Name checkBox3
    Text 聊天
    Checked False
    Button Name button1
    Text 确定
    2)在Form2类中,直接添加方法CheckBox_CheckedChanged。该方法的功能是当选中某个复选框时,该复选框的文字会变为绿色。
    public void checkBox_CheckedChanged(object sender, System.EventArgs e)
    {
    //引用CheckBox对象
    CheckBox checkbox = (CheckBox)sender;
    if (checkbox.Checked)
    {
    checkbox.ForeColor = Color.Green;
    }
    else
    {
    checkbox.ForeColor = Color.Black;
    }
    }
    3)将3个CHeckBox控件的CheckedChanged触发事件均选择为checkBox_CheckedChanged。
    4)选中button1控件,添加Click事件,并修改代码如下:
    private void button1_Click(object sender, EventArgs e)
    {
    string str = “选择结果:”;
    str += (this.checkBox1.Checked) ? (this.checkBox1.Text + “、”) : “”;
    str += (this.checkBox2.Checked) ? (this.checkBox2.Text + “、”) : “”;
    str += (this.checkBox3.Checked) ? (this.checkBox3.Text + “、”) : “”;
    //去除一个多余的、
    if (str[str.Length - 1] == ‘、’)
    {
    str = str.Substring(0, str.Length - 1);
    }
    MessageBox.Show(str);
    }
    该事件的功能为单击按钮时弹出消息对话框显示用户选择的结果。
    5)直接执行窗体Form2的方法。
    当执行项目时,C#会自动调用窗体Form1,此处示例不需要执行Form1,而希望执行窗体Form2,为了能够直接调用窗体Form2,必须在Form1类中找到Main方法,对其进行修改。
    static void Main()
    {
    Application.Run(new Form2());
    }
    修改后,运行项目时,将直接调用窗体Form2.
    6)按键编译并执行。
    6 CheckedListBox控件
    CheckedListBox控件提供一个选项列表,当选择项比较多时,或者在运行时需要动态地决定由哪些选型时,使用此控件比较方便。
    6.1 复选框列表控件中常用的基本属性
    1)Items属性:表示控件对象中所有选项的集合。
    2)MutiColumn属性:表示控件对象是否支持多列。
    3)ColumnWidth属性:表示控件对象支持多列时,列的宽度。
    4)CheckOnClick属性:表示当选定某项时是否应同时改变复选框状态。
    5)Sorted属性:表示控件对象中各项是否按字母排序。
    6)CheckedItems属性:表示控件对象中选中索引的集合。
    6.2 操作示例
    该示例的主要功能是能够对选项进行多次选择,单击【确定】按钮时,弹出用户选择的信息。
    【例】多项选择示例。
    1)在工程中添加一个新窗体Form3。

    窗体中各控件属性如下:
    控件 属性 值
    Lable Name label1
    Text 请选择你的业余爱好(可多选)
    CheckedListBox Name checkedListBox1
    Items 足球、篮球、排球、乒乓球、拳击、体操、射击、跑步、逛街、象棋、围棋、跳棋、军棋、五子棋、拱猪、双升、其它
    CheckOnClick True
    MutiColumn True
    Button Name button1
    Text 确定
    2)选中button1控件,添加Click事件,并修改代码如下:
    private void button1_Click(object sender, EventArgs e)
    {
    string str = “选择结果:”;
    //checkedListBox1.CheckedItems.Count是用户选择的个数
    //也可以用checkedListBox1.CheckedIndices.Count
    for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
    {
    //checkedListBox1.CheckedItems[i]是用户选中项集合中的第i项
    str += checkedListBox1.CheckedItems[i] + “、”;
    }
    if (str[str.Length - 1] == ‘、’)
    {
    str = str.Substring(0, str.Length - 1);
    }
    MessageBox.Show(str);
    }
    3)直接执行窗体Form3。
    7 RadioButton控件
    RadioButton控件的方法与CheckButton控件基本类似,但在一组中选择一个单选按钮时,则自动清除其他按钮,即仅能选择其中的一个。单选按钮是以他们所在的容器划分组的,直接在form上放置的单选按钮将自动成为一组,这时form就是容器。如果在一个Form上创建多个单选按钮组,则需要使用GroupBox或者Panel控件作为容器。
    7.1 单选按钮控件中常用的基本属性
    1)Text属性:表示与控件对象相关联的文本。
    2)Checked属性:表示该控件对象是否被选中。
    7.2 单选按钮中常用的基本事件
    CheckedChanged事件:表示当Checked属性值更改时触发的操作。
    7.3 操作示例
    该实例的主要功能是在文本框中显示用户的选择。3个RadioButton控件的CheckedChanged事件调用了公用的方法RadioButton_CheckedChanged
    【例】用户选择示例
    1)在工程中添加一个新窗体Form4,界面与窗体中各控件属性如下:

    控件 属性 值
    Label Name label1
    Text 请选择你要参与的项目
    RadioButton Name radioButton1
    Text 排球赛
    Checked False
    RadioButton Name radioButton2
    Text 足球赛
    Checked False
    RadioButton Name radioButton3
    Text 篮球赛
    Checked False
    TextBox Name textBox1
    2)在Form4类中,直接添加方法radioButton_CheckedChanged
    private void radioButton_CheckedChanged(object sender, System.EventArgs e)
    {
    //将object对象转型为RadioButton对象
    RadioButton check = (RadioButton)sender;
    if (check.Checked)
    {
    textBox1.Text = check.Text;
    }
    }
    3)将3个RadioButton控件的CheckedChanged触发事件均选择为radioButton_CheckedChanged。
    4)直接执行窗体Form4.
    8 ListBox控件
    ListBox控件用来显示一组条目,以便让操作者从中选择一条或者多条,然后进行相应的处理,用法以及属性有些类似于CheckedListBox。
    8.1 列表框控件中常用的基本属性
    除了介绍过的Items属性、MultiColumn属性以外,列表框控件还有其他一些常用属性。
    1)SelectionMode属性:表示选择项时可以使用的方法,它有4种选择:
    *None:不能选择。
    *One:同一时刻只能选择一个条目。
    *MultsSimple:同一时刻可以选择一个或者多个条目。
    *MultExtended:同一时刻可以选择一个或者多个条目,并且可以使用组合键(如和)帮助选择。
    2)SelectedIndex属性:表示控件对象中当前选定条目的从零开始的索引。
    3)SelectedItems属性:获取一个集合,该集合包含控件对象中所有当前选定条目的从零开始的所有项。
    4)Selectedindices属性:获取一个集合,该集合包含控件对象所有当前选定条目的从零开始的所有索引。
    8.2 操作示例
    该示例的主要功能是在Form5_Load中自动初始化列表框控件,向列表框中添加非重复的条目,以及删除用户在列表框中的选择(可以多选)。
    【例】列表框示例
    1)在工程中添加一个新窗体Form5,设计界面以及窗体中各控件属性如下:

    控件 属性 值
    Label Name label1
    Text 向列表中添加内容
    TextBox Name textBox1
    ListBox Name listBox1
    SelectionMode MultiSimple
    Button Name button1
    Text 添加非重复项
    Button Name button2
    Text 多项删除

    2)修改Form5_Load事件,代码如下:
    private void Form5_Load(object sender, EventArgs e)
    {
    for (int i = 0; i<6; i++)
    {
    //listbox1.Items.Add方法用户向列表框中添加条目
    listBox1.Items.Add(“第” + (i + 1).ToString() + “项”);
    }
    }
    3)修改button1_Click事件,代码如下:
    private void button1_Click(object sender, EventArgs e)
    {
    //插入非重复条目
    bool ifExist = false;
    if (textBox1.Text != “”)
    {
    //for语句用来查找是否有重复条目,listBox1.Items.Count代表列表框中条目的个数
    for (int i = 0; i < listBox1.Items.Count; i++)
    {
    if (listBox1.Items[i].ToString() == textBox1.Text)
    {
    ifExist = true;
    //找到时中断退出
    break;
    }
    }
    if (!ifExist)
    {
    listBox1.Items.Add(textBox1.Text);
    }
    }
    }
    4)修改button2_Click事件,代码如下:
    private void button2_Click(object sender, EventArgs e)
    {
    //多项删除
    //listBox1.SelectedIndices.Count用户选中条目的个数
    for (int i = listBox1.SelectedItems.Count - 1; i >= 0; i–)
    {
    listBox1.Items.Remove(listBox1.SelectedItems[i]);
    }
    }
    5)直接执行窗体Form5。
    9 ComboBox控件
    ComboxBox控件由两部分组成,即一个文本框和一个列表框。文本框可以用来编辑或者显示当前选中的条目。单击文本框旁边带有向下箭头的按钮,则会弹出列表框,使用键盘或者鼠标可以在列表框中快速选择条目。
    9.1 组合框控件中常用的基本属性
    除了前面介绍过的属性外,组合框控件还有其他的常用属性。
    DropDownStyle属性:表示组合框的样式,它有3种选择:
    *Simple:同时显示文本框和列表框,文本框可以被编辑。
    *DropDown:只显示文本框,需要通过键盘或者鼠标打开列表框,文本框可以被编辑。
    *DropDownList:只显示文本框,需要通过键盘或者鼠标打开列表框,文本框不可以被编辑。
    9.2 组合框控件中常用事件
    SelectedIndexChanged事件:表示SelectedIndex属性更改后触发的动作。
    9.3 操作示例
    该示例的主要功能是在组合框中添加小组参加的项目,只有用户选择了小组和项目才能进行添加。
    【例】组合框用法示例
    1)在工程中添加一个新窗体Form6,设计和窗体中各控件的属性如下:

    控件 属性 值
    Label Name label1
    Text 小组
    ComboBox Name comboBox1
    Items 第一组、第二组、第三组
    DropDownStyle DropDown
    Label Name label2
    Text 参加项目
    ComboBox Name comboBox2
    Items 工程一、工程二、工程三
    DropDownStyle DropDown
    ListBox Name listBox1
    2)添加comboBox1的SelectedIndexChanged事件
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
    //在两个组合框都进行了选择后,才进行添加
    if (comboBox1.SelectedIndex > -1 && comboBox2.SelectedIndex > -1)
    {
    listBox1.Items.Add(comboBox1.SelectedItem.ToString() + " " + comboBox2.SelectedItem.ToString());
    }
    }
    3)添加comboBox2的SelectedIndexChanged事件
    private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
    if (this.comboBox1.SelectedIndex > -1 && this.comboBox2.SelectedIndex > -1)
    {
    this.listBox1.Items.Add(this.comboBox1.SelectedItem.ToString() + " " + this.comboBox2.SelectedItem.ToString());
    }
    }
    4)直接执行窗体Form6。
    10 ToolTip控件
    ToolTip控件的用途是当鼠标位于某个控件上并停留一段时间后,显示该控件功能的提示信息。
    10.1 控件中常用的基本属性
    1)Active属性:表示该控件当前是否处于激活状态。
    2)AutomaticDelay属性:设置经过多长时间显示提示信息,默认值为500ms。
    3)AutoPopDelay属性:设置鼠标指针停留多长时间后提示信息消失。
    10.2 操作示例
    在上例的Form6中拖放一个ToolTip控件,然后再Form6的构造函数中加入下列代码:
    toolTip1.SetToolTip(comboBox1, “选择参加的小组。”);
    toolTip1.SetToolTip(comboBox2, “选择左边小组参加的项目。”);
    toolTip1.SetToolTip(listBox1, “各小组参加的项目列表”);
    运行时,分别将鼠标在上述控件中停留一段时间,观察显示的提示信息。实际上,如果控件有ToolTip属性,直接设置ToolTip属性也可以完成这种功能。
    11 PictureBox控件
    PictureBox控件是用于显示图像的Windows图片框控件。其常用的基本属性如下:
    1)Image:在PictureBox中显示的图像。
    2)SizeMode:图片在控件中的显示方式,有4中选择:
    *AutoSize:调整控件PictureBox大小,使其等于所包含的图像大小。
    *CenterImage:如果控件PictureBox比图像大,则图像将居中显示。如果图像比控件大,则图片将位于控件中心,而外边缘将被剪裁掉。
    *Normal:图像被置于控件的左上角。如果图像比控件大,则超出部分被剪裁掉。
    *StretchImage:控件中的图像被拉伸或收缩,以配合控件的大小。
    12 MainMenu控件
    MainMenu控件实际上是一个组件,该组件在运行时显示一个菜单。利用其菜单设计器可以迅速建立主菜单的结构。在菜单中,可以用符号“&”代表快捷键,如&F代表<Alt+F>;用符号“-”代表分隔符。
    【例】添加菜单示例
    1)在工程中添加一个新窗体Form7。
    2)将MainMenu组件从工具箱拖放到窗体上。
    3)在菜单设计器中,创建一个顶级菜项将其“Text”属性设置为“文件(&F)”。然后依次创建4个子菜单,将其“Text”属性分别设置为“新建(&New)”、“打开(&Open)”、“-”和“退出(&Exit)”。
    4)再创建一个顶级菜单项,并将其“Text”属性设置为“背景色”;两个子菜单项,其“Text”属性设置为“红色”和“白色”。
    5)再创建一个顶级菜单项,并将其“Text”属性设置为“测试执行文件所在目录”。

    6)双击对应菜单项,添加事件代码:
    private void menuItem2_Click(object sender, EventArgs e)
    {
    MessageBox.Show(“你选择的是“新建””);
    }

        private void menuItem3_Click(object sender, EventArgs e)
        {
            MessageBox.Show("你选择的是“打开”");
        }
    
        private void menuItem5_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    
        private void menuItem7_Click(object sender, EventArgs e)
        {
            this.BackColor = Color.Red;
        }
    
        private void menuItem8_Click(object sender, EventArgs e)
        {
            this.BackColor = Color.White;
        }
    
        private void menuItem9_Click(object sender, EventArgs e)
        {
            MessageBox.Show("exe文件所在目录为:\n\n" + Application.StartupPath + "\n");
        }
    

    7)直接执行窗体Form7。
    13 ProgressBar控件
    ProgressBar控件用来动态显示一个过程的进行程度,当某个操作需要较长的时间(几秒钟或者更长时间,例如复制操作)时,就需要使用ProgressBar向用户显示操作的进度情况。
    13.1 ProgressBar控件中常用的基本属性
    1)Minimum:表示进度条的最小值,默认值为0。
    2)Maximum:表示进度条的最大值,默认值为100。
    3)Value:表示进度条的当前值,默认值为0,它应该在minimum和Maximum之间取值。
    13.2 操作示例
    该示例的主要功能是如何操作进度条,progressBar2反映内循环,当变量值是10的倍数时加1;progressBar1反映的是外循环,其值每次加1。
    【例】进度条示例
    1)在工程中添加一个新窗体Form8。设计界面和窗体中各控件属性如下:

    控件 属性 值
    ProgressBar Name progressBar1
    Minimum 0
    ProgressBar Name progressBar2
    Minimum 0
    Label Name label1
    Text 外循环次数
    Label Name label2
    Text 内循环次数
    Button Name button1
    Text 开始计算
    2)添加【开始计算】按钮的Click响应事件:
    private void button1_Click(object sender, EventArgs e)
    {
    button1.Enabled = false;
    //Int32.Parse将字符型转换为整型
    int outLoop = Int32.Parse(textBox1.Text);
    int InnerLoop = Int32.Parse(textBox2.Text);
    progressBar1.Maximum = outLoop;
    progressBar2.Maximum = InnerLoop;
    for (int i = 1; i <= outLoop; i++)
    {
    for (int j = 1; j <= InnerLoop; j++)
    {
    //j是10的整数倍时,progressBar2的值递增
    if (j % 10 == 0)
    {
    progressBar2.Value = j;
    }
    }
    progressBar1.Value = i;
    }
    button1.Enabled = true;
    }
    3)直接执行窗体Form8。
    14 TabControl控件
    TabControl控件可以创建带有多个标签页的窗口,每个标签页都是一个容纳其他控件(例如TextBox或Button)的容器。当窗口功能复杂、控件很多时,就可以使用TabControl把它们按功能进行分类。
    14.1 TabControl控件中常用的基本属性
    1)Multiline属性:表示是否可以显示一行以上的选项卡。即当其包含很多标签页时,标签页是否可以换行,呈多行显示。
    2)ImageList属性:TabControl控件对象的标签上可以使用图标,该属性用来存放所需要的图标,然后该ImageList属性再调用此ImageList控件对象。
    3)TabPages属性:包含了TabControl控件对象中的所用标签页面,每个标签页面都是一个容器,用来存放其他控件对象。
    14.2 操作示例
    该示例主要演示如何添加一个选项卡。
    【例】选项卡示例
    1)在工程中添加一个新窗体Form9。
    2)向窗体上拖放一个Tabcontrol控件,调整其大小。
    3)向窗体上拖放一个ImageList控件,添加2个图标。
    4)设置TabControl的ImageList属性为ImageList1。
    5)设置TabControl的TabPages属性,添加2个标签页,再分别在2个标签页上放置相应的空间,页面如下:

    6)直接执行窗体Form9
    15 ListView控件
    ListView控件用列表的形式显示一组数据,每条数据都是一个ListItem类型的对象,通常使用ListView来显示对数据库的查询结果。Windows系统中的文件浏览器就是一个ListView控件。
    15.1 ListView控件中常用的剧本属性
    1)View属性:表示数据的显示模式,有4中选择:
    *Large Icons(大图标):每条数据都用一个带有文本的大图标表示。
    *Small Icons(小图标):每条数据都用一个带有文本的小图标表示。
    *List(列表):提供ListItems对象视图。
    *Details(详细列表):每条数据由多个字段组成,每个字段各占一列。
    2)MultiSelect属性:表示是否允许多行选择。
    15.2 操作示例
    该示例主要说明如何建立列表视图。
    【例】列表视图示例
    1)在工程中添加一个新窗体From10,设计界面如下:

    控件 属性 值
    ComboBox Name comboBox1
    DropDownStyle DropDownList
    Items 大图标、小图标、列表、详细列表
    ListView Name listView1
    LargeImageList imageList2
    SmallImageList ImageList1
    Columns 学号、姓名、成绩
    View Details
    Label Name label1
    Text 学号
    Label Name label2
    Text 姓名
    Label Name label3
    Text 成绩
    Label Name label4
    Text 视图模式
    Button Name button1
    Text 添加
    Button Name Button2
    Text 删除
    5)实现【添加】按钮的Click响应事件:
    private void button1_Click(object sender, EventArgs e)
    {
    int itemNumber = listView1.Items.Count;
    string[] subItem = { textBox1.Text, textBox2.Text, textBox3.Text };
    //listView1.Items.Insert方法用来在列表视图中添加ListView对象
    listView1.Items.Insert(itemNumber, new ListViewItem(subItem));
    listView1.Items[itemNumber].ImageIndex = 0;
    }
    6)实现【删除】按钮的Click响应时间:
    private void button2_Click(object sender, EventArgs e)
    {
    for (int i = listView1.SelectedItems.Count - 1; i >= 0; i–)
    {
    ListViewItem item = listView1.SelectedItems[i];
    //ListView1.Items.Remove用来去除列表视图中的ListViewItem对象
    listView1.Items.Remove(item);
    }
    }
    7)添加comboBox1的SelectIndexChanged事件,该事件用于选择显示方式:
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
    string str = comboBox1.SelectedItem.ToString();
    switch (str)
    {
    case “大图标”:
    listView1.View = View.LargeIcon;
    break;
    case “小图标”:
    listView1.View = View.SmallIcon;
    break;
    case “列表”:
    listView1.View = View.List;
    break;
    default:
    listView1.View = View.Details;
    break;
    }
    }
    8)直接执行窗体Form10。

    ————————————————
    版权声明:本文为CSDN博主「秦广说打杂」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qinguang3/article/details/71155948

    更多相关内容
  • VB控件属性大全【珍藏版】

    热门讨论 2012-04-21 11:28:45
    1.02、标签控件(Lable)的常用属性 7 1.03、文本框控件(TextBox)的常用属性 9 1.04、框架控件(Frame)的常用属性 13 1.05、命令按钮控件(CommandButton)的常用属性 15 1.06、复选框控件(CheckBox)的常用属性 17 1.07、...
  • input标签的type属性汇总

    千次阅读 2022-04-20 00:23:58
    单行文本输入框常用来输入简短的信息,如用户名、账号等,常用的属性有name、value、 maxlength。 2.密码输入框< input type=" password"/> 密码输入框用来输入密码,其内容将以圆点的形式显示。 3.单选按钮&...

    1.单行输入框< input type=“text”/>
    单行文本输入框常用来输入简短的信息,如用户名、账号等,常用的属性有name、value、 maxlength。

    2.密码输入框< input type=" password"/>
    密码输入框用来输入密码,其内容将以圆点的形式显示。

    3.单选按钮< input type=" radio"/>
    单选按钮用于单项选择,如选择性别、是否操作等。需要注意的是,在定义单选按钮时,必须为同一组中的选项指定相同的name值,这样“单选”才会生效。此外,可以对单选按钮应用 checked属性,指定默认选中项。

    4.复选框< input type=" checkbox"/>
    复选框常用于多项选择,如选择兴趣、爱好等,可对其应用 checked属性,指定默认选中项。

    5.普通按钮< input type=" button"/>
    普通按钮常常配合JavaScript脚本语言使用,初学者了解即可。

    6.提交按钮< nput type=" 'submit"/>
    提交按钮是表单中的核心控件,用户完成信息的输入后一般都需要单击提交按钮才能完成表单数据的提交。可以对其应用 value属性,改变提交按钮上的默认文本。

    7.重置按钮< input type=" reset"/>
    当用户输入的信息有误时,可单击重置按钮取消已输入的所有表单信息。可以对其应用 value属性,改变重置按钮上的默认文本。

    8.图像形式的提交按钮< input type=" image"/>
    图像形式的提交按钮与普通的提交按钮在功能上基本相同,只是它用图像替代了默认的按钮,外观上更加美观。需要注意的是,必须为其定义src属性指定图像的url地址。

    9.隐藏域< input type=" hidden"/>
    隐藏域对于用户是不可见的,通常用于后台的程序,初学者了解即可。

    10.文件域< input type=“file”/>
    当定义文件域时,页面中将出现一个“选择文件”按钮和提示信息文本,用户可以通过单击按钮然后直接选择文件的方式,将文件提交给后台服务器。

    11.emai类型< input type=“email”/>

    emai类型的标记是一种专门用于输入E-mai地址的文本输入框,用来验证emai输入框的内容是否符合E-mai地址格式;如果不符合,将提示相应的错误信息。

    12.url类型 <input type “url”/>
    Url类型的< input />标记是一种用于输入URL地址的文本框。如果所输入的内容是URL地址格式的文本,则会提交数据到服务器;如果输入的值不符合URL地址格式,则不允许提交,并且会有提示信息。

    13.tel类型< input type=“tel”/>
    tel类型用于提供输入电话号码的文本框,由于电话号码的格式千差万别,很难实现一个通用的格式。因此,tel类型通常会和 pattern属性配合使用。

    14 search类型< input type=" search"/>

    search类型是一种专门用于输入搜索关键词的文本框,它能自动记录一些字符,如站点搜索或者Google搜索。在用户输入内容后,其右侧会附带一个删除图标,单击这个图标按钮可以快速清除内容。

    15 color类型< input type=" color"/>
    color类型用于提供设置颜色的文本框,用于实现一个RGB颜色输入。其基本形式是# RRGGBB,默认值为#000000,通过value属性值可以更改默认颜色。单击clor类型文本框,可以快速打开拾色器面板,方便用户可视化选取一种颜色。

    16 number类型< input type=" number/>
    number类型的 <input/标记用于提供输入数值的文本框。在提交表单时,会自动检查该输入框中的内容是否为数字。如果输入的内容不是数字或者数字不在限定范围内则会出现错误提示。

    number类型的输入框可以对输入的数字进行限制,规定允许的最大值和最小值、合法的数字间隔或默认值等。具体属性说明如下。
    ●vale:指定输入框的初始值
    ●max:指定输入框可以接受的最大的输入值。
    min:指定输入框可以接受的最小的输入值。
    ●sep:输入域合法的数字间隔,如果不设置,默认值是1。

    17 range类型< input type=" range"/>
    range类型的<inpu标记用于提供一定范围内数值的输入范围,在网页中显示为滑动条。它的常用属性与 number类型一样,通过min属性和max属性,可以设置最小值与最大值,通过step属性指定每次滑动的步幅。如果想改变mnge的vale值,可以通过直接拖动滑动块或者单击滑动条来改变。

    18.Date pickers类型< input type= date, month,week…"/>
    Date picker类型是指时间日期类型。HML中提供了多个可供选取日期和时间的输入类型,用于验证输入的日期、具体。
    Date:选取日、月、年
    Month:选取月、年
    Week:选取周、年
    Time:选取时间(小时和分钟)
    Datetime:选取时间、日、月、年(UTC时间)
    datetime-local:选取时间、日、月、年(本地时间)

    UTC是 Universal Time Coordinated的英文缩写,即“协调世界时”,又称世界标准时间。简单地说,UTC时间就是0时区的时间。例如,如果北京时间为早上8点,则UTC时间为0点,即UC时间比北京时间晚8小时。

    注意:对于浏览器不支持的标记输入类型,则会在网页中显示为一个普通输入框。

    以上就是标签的type属性汇总,希望对您有所帮助。
    在这里插入图片描述

    展开全文
  • C#常用控件属性及方法汇总

    千次阅读 2018-12-28 08:15:06
    窗体类控件 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 (2) WindowState属性: 用来获取或设置窗体的窗口状态。 取值有三种: Normal (窗体正常显示...

    窗体类控件
    1、窗体
    1、常用属性
    (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。
    (2) WindowState属性: 用来获取或设置窗体的窗口状态。 取值有三种: Normal (窗体正常显示)、 Minimized
    (窗体以最小化形式显示)和 Maximized(窗体以最大化形式显示)。
    (3)StartPosition属性:用来获取或设置运行时窗体的起始位置。

    (4)Text属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的文字。
    (5)Width属性:用来获取或设置窗体的宽度。
    (6)Height属性:用来获取或设置窗体的高度。
    (7)Left属性:用来获取或设置窗体的左边缘的x坐标(以像素为单位)。
    (8)Top属性:用来获取或设置窗体的上边缘的y坐标(以像素为单位)。
    (9)ControlBox属性:用来获取或设置一个值,该值指示在该窗体的标题栏中是否显示控制框。值为true
    时将显示控制框,值为false时不显示控制框。
    (10)MaximizeBox属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最大化按钮。值
    为 true时显示最大化按钮,值为false时不显示最大化按钮。
    (11)MinimizeBox 属性:用来获取或设置一个值,该值指示是否在窗体的标题栏中显示最小化按钮。值
    为 true时显示最小化按钮,值为false时不显示最小化按钮。
    (12)AcceptButton 属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当按 Enter 键时就相
    当于单击了窗体上的该按钮。
    (13)CancelButton 属性:该属性用来获取或设置一个值,该值是一个按钮的名称,当按 Esc 键时就相当
    于单击了窗体上的该按钮。
    (14)Modal 属性:该属性用来设置窗体是否为有模式显示窗体。如果有模式地显示该窗体,该属性值为
    true;否则为 false。当有模式地显示窗体时,只能对模式窗体上的对象进行输入。必须隐藏或关闭模式窗
    体(通常是响应某个用户操作),然后才能对另一窗体进行输入。有模式显示的窗体通常用做应用程序中
    的对话框。
    (15)ActiveControl属性:用来获取或设置容器控件中的活动控件。窗体也是一种容器控件。
    (16)ActiveMdiChild属性:用来获取多文档界面(MDI)的当前活动子窗口。
    (17)AutoScroll 属性:用来获取或设置一个值,该值指示窗体是否实现自动滚动。如果此属性值设置为
    true,则当任何控件位于窗体工作区之外时,会在该窗体上显示滚动条。另外,当自动滚动打开时,窗体
    的工作区自动滚动,以使具有输入焦点的控件可见。
    (18)BackColor属性:用来获取或设置窗体的背景色。
    (19)BackgroundImage属性:用来获取或设置窗体的背景图像。
    (20)Enabled 属性:用来获取或设置一个值,该值指示控件是否可以对用户交互作出响应。如果控件可

    以对用户交互作出响应,则为 true;否则为false。默认值为true。
    (21)Font属性:用来获取或设置控件显示的文本的字体。
    (22)ForeColor属性:用来获取或设置控件的前景色。
    (23)IsMdiChild属性:获取一个值,该值指示该窗体是否为多文档界面(MDI)子窗体。值为 true时,
    是子窗体,值为false时,不是子窗体。
    (24)IsMdiContainer 属性:获取或设置一个值,该值指示窗体是否为多文档界面(MDI)中的子窗体的
    容器。值为true时,是子窗体的容器,值为false时,不是子窗体的容器。
    (25)KeyPreview属性:用来获取或设置一个值,该值指示在将按键事件传递到具有焦点的控件前,窗体
    是否将接收该事件。值为true时,窗体将接收按键事件,值为false时,窗体不接收按键事件。
    (26)MdiChildren属性:数组属性。数组中的每个元素表示以此窗体作为父级的多文档界面(MDI)子窗
    体。
    (27)MdiParent属性:用来获取或设置此窗体的当前多文档界面(MDI)父窗体。
    (28)ShowInTaskbar属性:用来获取或设置一个值,该值指示是否在Windows任务栏中显示窗体。
    (29)Visible属性:用于获取或设置一个值,该值指示是否显示该窗体或控件。值为true
    时显示窗体或控件,为 false时不显示。
    (30)Capture属性:如果该属性值为true,则鼠标就会被限定只由此控件响应,不管鼠标是否在此控件的
    范围内。
    2、常用方法
    下面介绍一些窗体的最常用方法。
    (1)Show方法:该方法的作用是让窗体显示出来,其调用格式为:
    窗体名.Show();
    其中窗体名是要显示的窗体名称。
    (2)Hide方法:该方法的作用是把窗体隐藏出来,其调用格式为:
    窗体名.Hide();
    其中窗体名是要隐藏的窗体名称。
    (3)Refresh方法:该方法的作用是刷新并重画窗体,其调用格式为:
    窗体名.Refresh();
    其中窗体名是要刷新的窗体名称。
    (4)Activate方法:该方法的作用是激活窗体并给予它焦点。其调用格式为:
    窗体名.Activate();
    其中窗体名是要激活的窗体名称。
    (5)Close方法:该方法的作用是关闭窗体。其调用格式为:
    窗体名.Close();
    其中窗体名是要关闭的窗体名称。
    (6)ShowDialog方法:该方法的作用是将窗体显示为模式对话框。其调用格式为:
    窗体名.ShowDialog();
    3.常用事件
    (1)Load事件:该事件在窗体加载到内存时发生,即在第一次显示窗体前发生。
    (2)Activated事件:该事件在窗体激活时发生。
    (3)Deactivate事件:该事件在窗体失去焦点成为不活动窗体时发生。
    (4)Resize事件:该事件在改变窗体大小时发生。
    (5)Paint事件:该事件在重绘窗体时发生。
    (6)Click事件:该事件在用户单击窗体时发生。

    (7)DoubleClick事件:该事件在用户双击窗体时发生。
    (8)Closed事件:该事件在关闭窗体时发生。

    B文本框类控件

    2、Label 控件
    1、常用属性:
    (1)Text属性:用来设置或返回标签控件中显示的文本信息。
    (2)AutoSize 属性:用来获取或设置一个值,该值指示是否自动调整控件的大小以完整显示其内容。取
    值为 true时,控件将自动调整到刚好能容纳文本时的大小,取值为false时,控件的大小为设计时的大小。
    默认值为false。
    (3)Anchor 属性:用来确定此控件与其容器控件的固定关系的。所谓容器控件指的是这样一种情况:往
    往在控件之中还有一个控件,例如最典型的就是窗体控件中会包含很多的控件,像标签控件、文本框等。
    这时称包含控件的控件为容器控件或父控件,而父控件称为子控件。这时将遇到一个问题,即子控件与父
    控件的位置关系问题,即当父控件的位置、大小变化时,子控件按照
    什么样的原则改变其位置、大小。Anchor属性就规定了这个原则。
    对于 Anchor 属性,可以设定 Top、Bottom、Right、Left 中的任意几
    种,设置的方法是在属性窗口中单击Anchor属性右边的箭头,将会
    出现如图 9-6 的窗口,通过它可设置 Anchor 属性值。图 9-6 中选中
    变黑的方位即为设定的方位控制,即图中所示的为 Left、Right、
    Bottom。此时,如果父窗口变化,子窗口将保证其左边缘与容器左边
    的距离、上边缘与容器上边的距离、底边与容器底边的距离等不变,
    效果如图9-7 所示。
    可见随着窗体的大小变
    化, Label控件也会随着
    变 。 而 不 变 的 则 是
    Archor中所规定的边
    缘与相应的父控件边缘
    的距离。
    (4)BackColor属性:
    用来获取或设置控件的背景色。当该属性值设置为 Color.Transparent 时,标签将透明显示,即背景色不再
    显示出来。
    (5)BorderStyle 属性:用来设置或返回边框。有三种选择:
    BorderStyle.None 为无边框(默认),BorderStyle.FixedSingle 为固
    定单边框,BorderStyle.Fixed3D 为三维边框。
    (6)TabIndex属性:用来设置或返回对象的Tab键顺序。
    (7)Enabled 属性:用来设置或返回控件的状态。值为 true 时允
    许使用控件,值为 false 时禁止使用控件,此时标签呈暗淡色,一
    般在代码中设置。图9-8 边框效果图
    另外,标签还具有Visible、ForeColor、Font等属性,具体含义请参考窗体的相应属性。

    3、TextBox 控件
    1、主要属性:
    (1)Text属性:Text属性是文本框最重要的属性,因为要显示的文本就包含在Text属性中。默认情况下,
    最多可在一个文本框中输入2048个字符。如果将MultiLine属性设置为true,则最多可输入32KB 的文本。
    Text属性可以在设计时使用【属性】窗口设置,也可以在运行时用代码设置或者通过用户输入来设置。可
    以在运行时通过读取Text属性来获得文本框的当前内容。
    (2)MaxLength 属性:用来设置文本框允许输入字符的最大长度,该属性值为 0 时,不限制输入的字符
    数。
    (3)MultiLine 属性:用来设置文本框中的文本是否可以输入多行并以多行显示。值为 true 时,允许多行
    显示。值为false时不允许多行显示,一旦文本超过文本框宽度时,超过部分不显示。
    (4)HideSelection属性:用来决定当焦点离开文本框后,选中的文本是否还以选中的方式显示,值为true,
    则不以选中的方式显示,值为 false将依旧以选中的方式显示。
    (5)ReadOnly属性:用来获取或设置一个值,该值指示文本框中的文本是否为只读。值为 true时为只读,
    值为 false时可读可写。
    (6)PasswordChar 属性:是一个字符串类型,允许设置一个字符,运行程序时,将输入到 Text 的内容全
    部显示为该属性值,从而起到保密作用,通常用来输入口令或密码。
    (7) ScrollBars属性: 用来设置滚动条模式, 有四种选择: ScrollBars.None (无滚动条), ScrollBars.Horizontal
    (水平滚动条),ScrollBars.Vertical(垂直滚动条),ScrollBars.Both(水平和垂直滚动条)。
    注意:只有当MultiLine属性为true时,该属性值才有效。在WordWrap属性值为true时,
    水平滚动条将不起作用
    (8)SelectionLength属性:用来获取或设置文本框中选定的字符数。只能在代码中使用,值为0 时,表示
    未选中任何字符。
    (9)SelectionStart属性:用来获取或设置文本框中选定的文本起始点。只能在代码中使用,第一个字符的
    位置为0,第二个字符的位置为1,依此类推。
    (10)SelectedText 属性:用来获取或设置一个字符串,该字符串指示控件中当前选定的文本。只能在代
    码中使用。
    (11)Lines:该属性是一个数组属性,用来获取或设置文本框控件中的文本行。即文本框中的每一行存放
    在 Lines数组的一个元素中。
    (12)Modified:用来获取或设置一个值,该值指示自创建文本框控件或上次设置该控件的内容后,用户
    是否修改了该控件的内容。值为true表示修改过,值为 false表示没有修改过。
    (13)TextLength属性:用来获取控件中文本的长度。
    (14)WordWrap:用来指示多行文本框控件在输入的字符超过一行宽度时是否自动换行到下一行的开始,
    值为 true,表示自动换到下一行的开始,值为false表示不自动换到下一行的开始。
    2、常用方法:
    (1)AppendText方法:把一个字符串添加到文件框中文本的后面,调用的一般格式如下:
    文本框对象.AppendText(str)
    参数 str是要添加的字符串。
    (2)Clear方法:从文本框控件中清除所有文本。调用的一般格式如下:
    文本框对象.Clear()该方法无参数。
    (3)Focus方法:是为文本框设置焦点。如果焦点设置成功,值为 true,否则为false。调用的一般格式如
    下:
    文本框对象.Focus()该方法无参数。

    (4)Copy方法:将文本框中的当前选定内容复制到剪贴板上。调用的一般格式如下:
    文本框对象.Copy()该方法无参数。
    (5)Cut方法:将文本框中的当前选定内容移动到剪贴板上。调用的一般格式如下:
    文本框对象.Cut()该方法无参数。
    (6)Paste方法:用剪贴板的内容替换文本框中的当前选定内容。调用的一般格式如下:
    文本框对象.Paste()该方法无参数。
    (7)Undo 方法:撤销文本框中的上一个编辑操作。调用的一般格式如下:
    文本框对象.Undo()该方法无参数。
    (8)ClearUndo方法:从该文本框的撤销缓冲区中清除关于最近操作的信息,根据应用
    程序的状态,可以使用此方法防止重复执行撤销操作。调用的一般格式如下:
    文本框对象.ClearUndo()该方法无参数。
    (9)Select方法:用来在文本框中设置选定文本。调用的一般格式如下:
    文本框对象.Select(start,length)
    该方法有两个参数,第一个参数start用来设定文本框中当前选定文本的第一个字符的位
    置,第二个参数length用来设定要选择的字符数。
    (10)SelectAll方法:用来选定文本框中的所有文本。调用的一般格式如下:
    文本框对象.SelectAll()该方法无参数。
    3、常用事件:
    (1)GotFocus事件:该事件在文本框接收焦点时发生。
    (2)LostFocus事件:该事件在文本框失去焦点时发生。
    (3)TextChanged事件:该事件在Text属性值更改时发生。无论是通过编程修改还是用户交互更改文本框
    的 Text属性值,均会引发此事件。

    4、RichTextBox控件
    RichTextBox是一种既可以输入文本、 又可以编辑文本的文字处理控件, 与TextBox控件相比, RichTextBox
    控件的文字处理功能更加丰富, 不仅可以设定文字的颜色、 字体, 还具有字符串检索功能。 另外, RichTextBox
    控件还可以打开、编辑和存储.rtf格式文件、ASCII文本格式文件及Unicode编码格式的文件。
    1、常用属性
    上面介绍的 TextBox 控件所具有的属性,RichTextBox 控件基本上都具有,除此之外,该控件还具有一些
    其他属性。
    (1)RightMargin属性:用来设置或获取右侧空白的大小,单位是像素。通过该属性可以设置右侧空白,
    如希望右侧空白为50像素,可使用如下语句:
    RichTextBox1.RightMargin=RichTextBox1.Width-50;
    (2)Rtf属性:用来获取或设置RichTextBox控件中的文本,包括所有RTF格式代码。可以使用此属性将
    RTF格式文本放到控件中以进行显示,或提取控件中的RTF格式文本。此属性通常用于在RichTextBox控
    件和其他RTF源(如 MicrosoftWord或 Windows写字板)之间交换信息。
    (3)SelectedRtf 属性:用来获取或设置控件中当前选定的 RTF 格式的格式文本。此属性使用户得以获取
    控件中的选定文本,包括RTF格式代码。如果当前未选定任何文本,给该属性赋值将把所赋的文本插入到
    插入点处。如果选定了文本,则给该属性所赋的文本值将替换掉选定文本。
    (4)SelectionColor属性:用来获取或设置当前选定文本或插入点处的文本颜色。
    (5)SelectionFont属性:用来获取或设置当前选定文本或插入点处的字体。
    2、常用方法

    前面介绍的 TextBox 控件所具有的方法,RichTextBox 控件基本上都具有,除此之外,该控件还具有一些
    其他方法。
    (1)Redo方法:用来重做上次被撤销的操作。调用的一般格式如下:
    RichTextBox对象.Redo()
    该方法无参数。
    (2)Find方法:用来从RichTextBox控件中查找指定的字符串。经常使用的调用格式如下:
    [格式1]:
    RichTextBox对象.Find(str)
    [功能]:在指定的“RichTextBox”控件中查找文本,并返回搜索文本的第一个字符在控件内的位置。如果
    未找到搜索字符串或者str参数指定的搜索字符串为空,则返回值为1。
    [格式2]:
    RichTextBox对象.Find(str,RichTextBoxFinds)
    [功能]:在“RichTextBox 对象”指定的文本框中搜索 str 参数中指定的文本,并返回文本的第一个字符在
    控件内的位置。如果返回负值,则未找到所搜索的文本字符串。还可以使用此方法搜索特定格式的文本。
    参数RichTextBoxFinds指定如何在控件中执行文本搜索,其取值及其含义如表9-4 所示。

    [格式3]:
    RichTextBox对象.Find(str,start,RichTextBoxFinds)
    [功能]:这里Find方法与前面的格式2 基本类似,不同的只是通过设置控件文本内的搜索起始位置来缩小
    文本搜索范围,start参数表示开始搜索的位置。此功能使用户得以避开可能已搜索过的文本或已经知道不
    包含要搜索的特定文本的文本。如果在options参数中指定了RichTextBoxFinds.Reverse值,则 start参数的
    值将指示反向搜索结束的位置,因为搜索是从文档底部开始的。
    (3)SaveFile方法:用来把RichTextBox中的信息保存到指定的文件中,调用格式有以下三种。
    [格式1]:
    RichTextBox对象名.SaveFile(文件名);
    [功能]:将 RichTextBox控件中的内容保存为RTF格式文件中。
    [格式2]:
    RichTextBox对象名.SaveFile(文件名,文件类型);
    [功能]:将 RichTextBox控件中的内容保存为“文件类型”指定的格式文件中。
    [格式3]:
    RichTextBox对象名.SaveFile(数据流,数据流类型);
    [功能]:将 RichTextBox控件中的内容保存为“数据流类型”指定的数据流类型文件中。
    其中,文件类型或数据流类型的取值及含义如表9-5所示。
    (4)LoadFile方法:使用LoadFile方法可以将文本文件、RTF文件装入RichTextBox控件。主要的调用格
    式有以下三种。
    [格式1]:
    RichTextBox对象名.LoadFile(文件名);

    [功能]:将RTF格式文件或标准ASCII文本文件加载到RichTextBox控件中。
    [格式2]:
    RichTextBox对象名.LoadFile(数据流,数据流类型);
    [功能]:将现有数据流的内容加载到RichTextBox控件中。
    [格式3]:
    RichTextBox对象名.LoadFile(文件名,文件类型);
    [功能]:将特定类型的文件加载到RichTextBox控件中。
    注意:文件类型和数据流格式见表9-5。

    5、NumericUpDown 控件
    【Windows 窗体】控件组中的 NumericUpDown 控件看起来像是一个文本框与一对用户可单击以调整值的
    箭头的组合。可以通过单击向上和向下按钮、按向上和向下箭头键来增大和减小数字,也可以直接输入数
    字。单击向上箭头键时,值向最大值方向增加;单击向下箭头键时,值
    向最小值方向减少。该控件在工具箱中的图标为 。
    该控件的样式如图9-13所示。
    1、常用属性:
    (1)DecimalPlaces:获取或设置该控件中显示的小数位数。
    (2)Hexadecimal:获取或设置一个值,该值指示该控件是否以十六进制格式显示所包
    含的值。
    (3)Increment:获取或设置单击向上或向下按钮时,该控件递增或递减的值。
    (4)Maximum:获取或设置该控件的最大值。
    (5)Minimum:获取或设置该控件的最小值。
    (6)Value:获取或设置该控件的当前值。
    与 TextBox控件一样,NumericUpDown控件的常用事件有:ValueChanged、GotFocus、LostFocus等。
    按钮类控件
    6、Button 控件
    Button控件又称按钮控件,是 Windows应用程序中最常用的控件之一,通常用它来执行命令。如果按钮具
    有焦点,就可以使用鼠标左键、Enter键或空格键触发该按钮的Click事件。通过设置窗体的AcceptButton
    或 CancelButton 属性,无论该按钮是否有焦点,都可以使用户通过按 Enter 或 Esc 键来触发按钮的 Click
    事件。一般不使用 Button 控件的方法。Button 控件也具有许多如 Text、ForeColor 等的常规属性,此处不
    再介绍,只介绍该控件有特色的属性。以后介绍的控件也采用同样的方法来处理。
    1、常用属性

    (1)DialogResult属性:当使用ShowDialog方法显示窗体时,可以使用该属性设置当用户按了该按钮后,
    ShowDialog方法的返回值。值有:OK、Cancel、Abort、Retry、Ignore、Yes、No等。
    (2)Image属性:用来设置显示在按钮上的图像。
    (3)FlatStyle属性:用来设置按钮的外观。其取值及含义如表9-7 所示。

    2、常用事件:
    (1)Click事件:当用户用鼠标左键单击按钮控件时,将发生该事件。
    (2)MouseDown事件:当用户在按钮控件上按下鼠标按钮时,将发生该事件。
    (3)MouseUp事件:当用户在按钮控件上释放鼠标按钮时,将发生该事件。

    7、GroupBox 控件
    GroupBox控件又称为分组框,它在工具箱中的图标是 。该控件常用于为其他控件提供可
    识别的分组,其典型的用法之一就是给RadioButton控件分组。可以通过分组框的Text属性为分组框中的
    控件向用户提供提示信息,如图 9-14 所示。设计时,向GroupBox 控件中添
    加控件的方法有两种:一是直接在分组框中绘制控件;二是把某一个已存在
    的控件复制到剪贴板上,然后选中分组框,再执行粘贴操作即可。位于分组
    框中的所有控件随着分组框的移动而一起移动,随着分组框的删除而全部删
    除,分组框的Visible属性和Enabled属性也会影响到分组框中的所有控件。
    分组框的最常用的属性是Text,一般用来给出分组提示。

    8、RadioButton控件
    RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供
    两个或多个互斥选项,即在一组单选钮中只能选择一个,如图9-14所示。
    1、常用属性:
    (1)Checked属性:用来设置或返回单选按钮是否被选中,选中时值为true,没有选中时值为false。
    (2)AutoCheck 属性:如果 AutoCheck 属性被设置为 true(默认),那么当选择该单选按钮时,将自动清
    除该组中所有其他单选按钮。对一般用户来说,不需改变该属性,采用默认
    值(true)即可。
    (3)Appearance 属性:用来获取或设置单选按钮控件的外观。当其取值为 Appearance.Button 时,将使单
    选按钮的外观像命令按钮一样:当选定它时,它看似已被按下。当取值为 Appearance.Normal 时,就是默
    认的单选按钮的外观。
    (4)Text属性:用来设置或返回单选按钮控件内显示的文本,该属性也可以包含访问键,即前面带有“&”
    符号的字母,这样用户就可以通过同时按Alt键和访问键来选中控件。
    2、常用事件:

    (1)Click事件:当单击单选按钮时,将把单选按钮的Checked属性值设置为true,同时发生Click事件。
    (2)CheckedChanged事件:当Checked属性值更改时,将触发CheckedChanged事件。

    9、CheckBox 控件
    CheckBox控件的常用属性如下。
    (1)TextAlign属性:用来设置控件中文字的对齐方式,有9种选择,如图9-16 所示。
    从上到下、从左至右分别是:ContentAlignment.TopLeft、ContentAlignment.TopCenter、
    ContentAlignment.TopRight、ContentAlignment.MiddleLeft、ContentAlignment.MiddleCenter、
    ContentAlignment.MiddleRight、ContentAlignment.BottomLeft、ContentAlignment.BottomCenter
    和 ContentAlignment.BottomRight。该属性的默认值为ContentAlignment.MiddleLeft,即文字左
    对齐、居控件垂直方向中央。
    (2)ThreeState属性:用来返回或设置复选框是否能表示三种状态,如果属性值为true时,表示可以表示
    三种状态—选中、没选中和中间态(CheckState.Checked、CheckState.Unchecked
    和 CheckState.Indeterminate),属性值为false时,只能表示两种状
    态——选中和没选中。
    (3)Checked属性:用来设置或返回复选框是否被选中,值为true时,表示复选框被选中,值为false时,
    表示复选框没被选中。当ThreeState属性值为true时,中间态也表示选中。
    (4)CheckState 属性:用来设置或返回复选框的状态。在 ThreeState 属性值为 false 时,取值有
    CheckState.Checked或CheckState.Unchecked。在ThreeState属性值被设置为True时,CheckState还可以取
    值 CheckState.Indeterminate,在此时,复选框显示为浅灰色选中状态,该状态通常表示该选项下的多个子
    选项未完全选中。
    CheckBox控件的常用事件有Click和CheckedChanged等,其含义及触发时机与单选按钮
    完成一致。
    列表类控件
    10、ListBox 控件
    ListBox 控件又称列表框,它在工具箱中的图标为,它显示一个项目列表供用户选择。在列表框中,用户
    一次可以选择一项,也可以选择多项。
    1、常用属性:
    (1) Items属性: 用于存放列表框中的列表项,
    是一个集合。通过该属性,可以添加列表项、
    移除列表项和获得列表项的数目。
    (2)MultiColumn 属性:用来获取或设置一
    个值,该值指示ListBox是否支持多列。值
    为 true 时表示支持多列,值为 false 时不支持
    多列。当使用多列模式时,可以使控件得以显
    示更多可见项,如图9-19 所示。
    (3)ColumnWidth 属性:用来获取或设置多
    列 ListBox控件中列的宽度。
    (4)SelectionMode属性:用来获取或设置在ListBox控件中选择列表项的方法。当 SelectionMode属性设
    置为 SelectionMode.MultiExtended 时,按下 Shift 键的同时单击鼠标或者同时按 Shift 键和箭头键之一(上
    箭头键、下箭头键、左箭头键和右箭头键),会将选定内容从前一选定项扩展到当前项。按 Ctrl 键的同时
    单击鼠标将选择或撤销选择列表中的某项;当该属性设置为 SelectionMode.MultiSimple 时,鼠标单击或按- 11 -

    空格键将选择或撤销选择列表中的某项;该属性的默认值为SelectionMode.One,则只能选择一项。
    (5)SelectedIndex属性:用来获取或设置ListBox控件中当前选定项的从零开始的索引。如果未选定任何
    项,则返回值为1。对于只能选择一项的ListBox控件,可使用此属性确定ListBox中选定的项的索引。如
    果 ListBox 控件的 SelectionMode 属性设置为 SelectionMode.MultiSimple 或 SelectionMode.MultiExtended,
    并在该列表中选定多个项,此时应用SelectedIndices来获取选定项的索引。
    (6)SelectedIndices。该属性用来获取一个集合,该集合包含 ListBox 控件中所有选定项的从零开始的索
    引。
    (7)SelectedItem属性:获取或设置ListBox中的当前选定项。
    (8)SelectedItems属性:获取 ListBox控件中选定项的集合,通常在ListBox控件的SelectionMode属性值
    设置为SelectionMode.MultiSimple或SelectionMode.MultiExtended(它指示多重选择ListBox)时使用。
    (9)Sorted属性:获取或设置一个值,该值指示ListBox控件中的列表项是否按字母顺序排序。如果列表
    项按字母排序,该属性值为true;如果列表项不按字母排序,该属性值为false。默认值为false。在向已排
    序的 ListBox控件中添加项时,这些项会移动到排序列表中适当的位置。
    (10)Text 属性:该属性用来获取或搜索 ListBox 控件中当前选定项的文本。当把此属性值设置为字符串
    值时,ListBox 控件将在列表内搜索与指定文本匹配的项并选择该项。若在列表中选择了一项或多项,该
    属性将返回第一个选定项的文本。
    (11)ItemsCount属性:该属性用来返回列表项的数目。
    2、常用方法:
    (1)FindString方法:用来查找列表项中以指定字符串开始的第一个项,有两种调用格式。
    [格式1]:
    ListBox对象.FindString(s);
    [功能]:在“ListBox 对象”指定的列表框中查找字符串 s,如果找到则返回该项从零开始的索引;如果找
    不到匹配项,则返回ListBox.NoMatches。
    [格式2]:
    ListBox对象.FindString(s,n);
    [功能]:在 ListBox 对象指定的列表框中查找字符串 s,查找的起始项为n+1,即 n 为开始查找的前一项的
    索引。如果找到则返回该项从零开始的索引;如果找不到匹配项,则返回ListBox.NoMatches。
    注意:FindString 方式只是词语部分匹配,即要查找的字符串在列表项的开头,便认为是匹配的,如果要
    精确匹配,即只有在列表项与查找字符串完全一致时才认为匹配,可使用FindStringExact方法,调用格式
    与功能与FindString基本一致。
    (2)SetSelected方法:用来选中某一项或取消对某一项的选择,调用格式及功能如下。
    [格式]:
    ListBox对象.SetSelected(n,l);
    [功能]:如果参数 l 的值是 true,则在 ListBox 对象指定的列表框中选中索引为 n 的列表项,如果参数l 的
    值是 false,则索引为n 的列表项未被选中。
    (3)Items.Add方法:用来向列表框中增添一个列表项,调用格式及功能如下。
    [格式]:
    ListBox对象.Items.Add(s);
    [功能]:把参数s添加到“listBox对象”指定的列表框的列表项中。
    (4)Items.Insert方法:用来在列表框中指定位置插入一个列表项,调用格式及功能如下。
    [格式]:
    ListBox对象.Items.Insert(n,s);
    [功能]:参数n代表要插入的项的位置索引,参数 s代表要插入的项,其功能是把s插入到“listBox对象”
    指定的列表框的索引为n的位置处。

    (5)Items.Remove方法:用来从列表框中删除一个列表项,调用格式及功能如下。
    [格式]:
    ListBox对象.Items.Remove(k);
    [功能]:从 ListBox对象指定的列表框中删除列表项s。
    (6)Items.Clear方法:用来清除列表框中的所有项。其调用格式如下:
    ListBox对象.Items.Clear();
    该方法无参数。
    (7)BeginUpdate方法和EndUpdate方法:这两个方法均无参数,调用格式分别如下:
    ListBox对象.BeginUpdate();
    ListBox对象.EndUpdate();
    这两个方法的作用是保证使用 Items.Add 方法向列表框中添加列表项时,不重绘列表框。即在向列表框添
    加项之前,调用BeginUpdate方法,以防止每次向列表框中添加项时都重新
    绘制 ListBox 控件。完成向列表框中添加项的任务后,再调用 EndUpdate 方法使 ListBox 控件重新绘制。
    当向列表框中添加大量的列表项时,使用这种方法添加项可以防止在绘制 ListBox 时的闪烁现象。一个例
    子程序如下:
    publicvoidAddToMyListBox()
    {listBox1.BeginUpdate();
    for(intx=1;x<5000;x++)
    {
    listBox1.Items.Add(“Item”+x.ToString());
    }
    listBox1.EndUpdate();
    }
    ListBox控件常用事件有Click和 SelectedIndexChanged,SelectedIndexChanged事件在列表框中改变选中项
    时发生。

    11、ComboBox 控件
    ComboBox 控件又称组合框,在工具箱中的图标为。默认情况下,组合框分两个部分显示:顶部是一个允
    许输入文本的文本框,下面的列表框则显示列表项。可以认为ComboBox就是文本框与列表框的组合,与
    文本框和列表框的功能基本一致。与列表框相比,组合框不能多选,它无 SelectionMode 属性。但组合框
    有一个名为DropDownStyle的属性,该属性用来设置或获取组合框的样式,其取值及含义如表9-10所示。

    组合框的各种样式如图9-22 所示, 左边的组合框能够通过文本框输入文本, 中间的组合框则不能输入文本,
    只能选择列表项。

    12、CheckedListBox 控件
    CheckedListBox控件又称复选列表框,它扩展了ListBox控件,它几乎
    能完成列表框可以完成的所有任务,并且还可以在列表项旁边显示复
    选标记。两种控件间的其他差异在于,复选列表框只支持

    DrawMode.Normal,并且复选列表框只能有一项选定或没有任何选定。此处需要注意一点:选定的项是指
    窗体上突出显示的项,已选中的项是指左边的复选框被选中的项。复选列表框的样式如图9-23所示。
    除具有列表框的全部属性外,它还具有以下属性。
    (1)CheckOnClick属性:获取或设置一个值,该值指示当某项被选定时
    是否应切换左侧的复选框。如果立即切换选中标记,则该属性值为true;
    否则为false。默认值为false。
    (2)CheckedItems 属性:该属性是复选列表框中选中项的集合,只代表
    处于CheckState. Checked或CheckState.Indeterminate状态的那些项。 该集
    合中的索引按升序排列。
    (3)CheckedIndices 属性:该属性代表选中项(处于选中状态或中间状
    态的那些项)索
    引的集合。
    PictureBox控件的使用
    13、PictureBox 控件的使用
    PictureBox 控件又称图片框,常用于图形设计和图像处理应用程序,在该控件中可以加载的图像文件格式
    有:位图文件(.Bmp)、图标文件(.ICO)、图元文件(.wmf)、.JPEG 和.GIF 文件。下而仅介绍该控件的
    常用属性和事件。
    1、常用属性:
    (1)Image属性:用来设置控件要显示的图像。把文件中的图像加载到图片框通常采用以下三种方式。
    设计时单击Image属性,在其后将出现【…】按钮,单击该按钮将出现一个【打开】对话框,在该对话框
    中找到相应的图形文件后单击【确定】按钮。产生一个Bitmap类的实例并赋值给Image属性。形式如下:
    Bitmapp=newBitmap(图像文件名);
    pictureBox对象名.Image=p;
    通过 Image.FromFile方法直接从文件中加载。形式如下:
    pictureBox对象名.Image=Image.FromFile(图像文件名);
    (2)SizeMode属性:用来决定图像的显示模式。

    14、Timer 控件
    Timer 控件又称定时器控件或计时器控件,在工具箱中的图标是 ,该控件的主要作用是按一定的
    时间间隔周期性地触发一个名为Tick的事件, 因此在该事件的代码中可以放置一些需要每隔一段时间重复
    执行的程序段。在程序运行时,定时器控件是不可见
    的。
    1、常用属性:
    (1)Enabled 属性:用来设置定时器是否正在运行。值为 true 时,定时器正在运行,值为 false 时,定时
    器不在运行。
    (2)Interval属性:用来设置定时器两次Tick事件发生的时间间隔,以毫秒为单位。如它的值设置为500,
    则将每隔0.5秒发生一个Tick事件。
    2、常用方法:
    (1)Start方法:用来启动定时器。调用的一般格式如下:
    Timer控件名.start();
    该方法无参数。
    (2)Stop方法:用来停止定时器。调用的一般格式如下:
    Timer控件名.stop();
    该方法无参数。
    3、常用事件:
    定义器控件响应的事件只有Tick,每隔Interval时间后将触发一次该事件。
    15、ProgressBar控件和 TrackBar控件
    1.ProgressBar控件
    ProgressBar 控件又称进度条控件,它在工具栏中的图标为 ,该控件在水平栏中显示适当长度
    的矩形来指示进程的进度。当执行进程时,进度条用系统突出显示颜色在水平栏中从左向右进行填充。进
    程完成时,进度栏被填满。当某进程运行时间较长时,如果没有视觉提示,用户可能会认为应用程序不响
    应,通过在应用程序中使用进度条,就可以告诉用户应用程序正在执行冗长的任务且应用程序仍在响应。
    ProgressBar控件的常用属性如下。
    (1)Maximum属性:用来设置或返回进度条能够显示的最大值,默认值为100。
    (2)Minimum属性:用来设置或返回进度条能够显示的最小值,默认值为0。
    (3)Value属性:用来设置或返回进度条的当前位置。
    (4)Step属性:用来设置或返回一个值,该值用来决定每次调用PerformStep 方法时, Value属性增加的
    幅度。例如,如果要复制一组文件,则可将 Step 属性的值设置为 1,并将 Maximum 属性的值设置为要复
    制的文件总数。在复制每个文件时,可以调用PerformStep方法按Step属性的值增加进度栏。
    ProgressBar控件的常用方法如下。
    (1)Increment方法:用来按指定的数量增加进度条的值,调用的一般格式如下:
    progressBar对象.Increment(n);
    其功能是把“progressBar对象”指定的进度条对象的Value属性值增加n,n为整数。调用该方法之后,若
    Value属性大于Maximum属性的值,则 Value属性值就是Maximum值,若Value属性小于Minimum属性
    值,则 Value属性值就是Minimum值。
    (2)PerformStep方法:用来按step属性值来增加进度条的Value属性值,调用的一般格式如下:
    progressBar对象.PerformStep();
    该方法无参数。例如,下列程序段是一个显示复制多个文件的进度的进度条使用方法。
    privatevoidCopyWithProgress(string[]filenames)
    {pBar1.Visible=true;
    pBar1.Minimum=1;
    pBar1.Maximum=filenames.Length;
    pBar1.Value=http://www.cnblogs.com/gyb1226/archive/2012/03/07/1;
    pBar1.Step=1;
    for(intx=1;x<=filenames.Length;x++)
    {if(CopyFile(filenames[x-1])==true)
    {
    pBar1.PerformStep();
    }
    }
    }
    ProgressBar控件能响应很多事件,但一般很少使用。
    2.TrackBar控件
    TrackBar 控件又称滑块控件、跟踪条控件,它在工具箱中的图标是“ ” 。该控件主要用于在
    大量信息中进行浏览,或用于以可视形式调整数字设置。TrackBar控件有两部分:缩略图(也称为滑块)
    和刻度线。缩略图是可以调整的部分,其位置与 Value 属性相对应。刻度线是按规则间隔分隔的可视化指
    示符。跟踪条控件可以按指定的增量移动,并且可以水平或者垂直排列。
    TrackBar控件的常用属性如下。
    (1)Maximum属性:用来获取或设置TrackBar控件可表示的范围上限,即最大值。
    (2)Minimum属性:用来获取或设置TrackBar控件可表示的范围下限,即最小值。
    (3)Orientation属性:用来获取或设置一个值,该值指示跟踪条是在水平方向还是在垂
    直方向。
    (4)LargeChange属性:用来获取或设置一个值,该值指示当滑块长距离移动时应为Value属性中加上或
    减去的值。
    (5)SmallChange属性:用来获取或设置当滑块短距离移动时对Value属性进行增减的值。
    (6)Value属性:用来获取或设置滑块在跟踪条控件上的当前位置的值。
    (7)TickFrequency属性:用来获取或设置一个值,该值指定控件上绘制的刻度之间的增量。
    (8)TickStyle 属性:用来获取或设置一个值,该值指示如何显示跟踪条上的刻度线。

    TrackBar控件的常用事件是ValueChanged,该事件在TrackBar控件的Value属性值改变时发生。

    16、HScrollBar 控件和 VScrollBar控件的使用
    滚动条(ScrollBar)是大部分Windows应用程序中都具有的控件,是 Windows界面的
    一种常见元素,通常分为水平滚动条(HscrollBar)和垂直滚动条(VscrollBar)。HScrollBar
    在工具箱中的图标是,VScrollBar控件在工具箱中的图标是。这两
    个控件主要用于在应用程序或控件中水平或垂直滚动,以方便在较长的列表中或大量信息中
    转移。
    1、常用属性:
    (1)Minimum和 Maximum属性:与TrackBar控件的同名属性基本相同。
    (2)Value属性:用于设置或返回滑块在滚动条中所处的位置,其默认值为0。当滑块
    的位置值为最小值时,滑块移到水平滚动条的最左端位置,或移到垂直滚动条的顶端位置。
    当滑块的位置值为最大值时,滑块移到水平滚动条的最右端位置或垂直滚动条的底端位置。
    (3)SmallChange和LargeChange属性:这两个属性主要用于调整滑块移动的距离。其
    中 SmallChange属性用于控制当鼠标单击滚动条两边的箭头时,滑块滚动的值,即 Value属性
    增加或减小的值。而LargeChange属性则控制当用鼠标直接单击滚动条时滑块滚动的值。当
    用户按下PageUp键或PageDown键或者在滑块的任何一边单击滚动条轨迹时,Value属性将
    按照 LargeChange属性中设置的值进行增加或减小。
    2、常用事件:
    (1)Scroll事件:该事件在用户通过鼠标或键盘移动滑块后发生。
    (2)ValueChanged事件:该事件在滚动条控件的Value属性值改变时发生。
    滚动条的使用方法与TrackBar控件基本一致,此处不再赘述。

    对话框类控件

    17、OpenFileDialog 控件
    OpenFileDialog控件又称打开文件对话框,主要用来弹出Windows中标准的【打开文件】
    对话框。该控件在工具箱中的图标为 。
    OpenFileDialog控件的常用属性如下。
    (1)Title属性:用来获取或设置对话框标题,默认值为空字符串("")。如果标题为空字符串,则系统将
    使用默认标题: “打开” 。
    (2)Filter属性:用来获取或设置当前文件名筛选器字符串,该字符串决定对话框的【另存为文件类型】
    或【文件类型】框中出现的选择内容。对于每个筛选选项,筛选器字符串都包含筛选器说明、垂直线条(|)
    和筛选器模式。不同筛选选项的字符串由垂直线条隔开,例如: “文本文件(.txt)|.txt|所有文件(.)|.” 。
    还可以通过用分号来分隔各种文件类型,可以将多个筛选器模式添加到筛选器中,例如: “图像文件
    (.BMP;.JPG;.GIF)|.BMP;.JPG; .GIF|所有文件(.)|.” 。
    (3)FilterIndex属性:用来获取或设置文件对话框中当前选定筛选器的索引。第一个筛选器的索引为1,
    默认值为1。
    (4)FileName 属性:用来获取在打开文件对话框中选定的文件名的字符串。文件名既包含文件路径也包
    含扩展名。如果未选定文件,该属性将返回空字符串("")。
    (5)InitialDirectory属性:用来获取或设置文件对话框显示的初始目录,默认值为空字符串("")。

    (6)ShowReadOnly属性:用来获取或设置一个值,该值指示对话框是否包含只读复选框。如果对话框包
    含只读复选框,则属性值为true,否则属性值为false。默认值为false。
    (7)ReadOnlyChecked属性:用来获取或设置一个值,该值指示是否选定只读复选框。如果选中了只读复
    选框,则属性值为true,反之,属性值为false。默认值为false。
    (8)Multiselect属性:用来获取或设置一个值,该值指示对话框是否允许选择多个文件。如果对话框允许
    同时选定多个文件,则该属性值为true,反之,属性值为false。默认值为false。
    (9)FileNames属性:用来获取对话框中所有选定文件的文件名。每个文件名都既包含文件路径又包含文
    件扩展名。如果未选定文件,该方法将返回空数组。
    (10)RestoreDirectory属性:用来获取或设置一个值,该值指示对话框在关闭前是否还原当前目录。假设
    用户在搜索文件的过程中更改了目录,且该属性值为 true,那么,对话框会将当前目录还原为初始值,若
    该属性值为 false,则不还原成初始值。默认值为 false。OpenFileDialog 控件的常用方法有两个:OpenFile
    和 ShowDialog方法,本节只介绍ShowDialog方法,该方法的作用是显示通用对话框,其一般调用形式如
    下:
    通用对话框对象名.ShowDialog();
    通用对话框运行时,如果单击对话框中的【确定】按钮,则返回值为 DialogResult.OK;否则返回值为
    DialogResult.Cancel。其他对话框控件均具有ShowDialog方法,以后不再重复介绍。
    18、SaveFileDialog 控件
    SaveFileDialog 控件又称保存文件对话框,主要用来弹出 Windows 中标准的【保存文件】对话框。该控件
    在工具箱中的图标为 。
    SaveFileDialog 控件也具有 FileName、Filter、FilterIndex、InitialDirectory、Title 等属性,这些属性的作用
    与 OpenFileDialog对话框控件基本一致,此处不再赘述。
    需注意的是:上述两个对话框只返回要打开或保存的文件名,并没有真正提供打开或保存文件的功能,程
    序员必须自己编写文件打开或保存程序,才能真正实现文件的打开和保存功能。

    19、FontDialog 控件
    FontDialog控件又称字体对话框,主要用来弹出Windows中标准的【字体】对话框。该控件在工具箱中的
    图标为 。字体对话框的作用是显示当前安装在系统中的字体列表,供用户进行选择。下面
    介绍字体对话框的主要属性。
    (1)Font属性:该属性是字体对话框的最重要属性,通过它可以设定或获取字体信息。
    (2)Color属性:用来设定或获取字符的颜色。
    (3)MaxSize属性:用来获取或设置用户可选择的最大磅值。
    (4)MinSize属性:用来获取或设置用户可选择的最小磅值。192VisualC#.NET应用教程
    (5)ShowColor属性:用来获取或设置一个值,该值指示对话框是否显示颜色选择框。如果对话框显示颜
    色选择框,属性值为true,反之,属性值为false。默认值为false。
    (6)ShowEffects 属性:用来获取或设置一个值,该值指示对话框是否包含允许用户指定删除线、下划线
    和文本颜色选项的控件。如果对话框包含设置删除线、下划线和文本颜色选项的控件,属性值为 true,反
    之,属性值为false。默认值为true。
    20、ColorDialog控件
    ColorDialog 控件又称颜色对话框,主要用来弹出 Windows 中标准的【颜色】对话框。该控件在工具箱中
    的图标为 。颜色对话框的作用是供用户选择一种颜色,并用 Color 属性记录用户选择- 18 -

    的颜色值。下面介绍颜色对话框的主要属性。
    (1)AllowFullOpen属性:用来获取或设置一个值,该值指示用户是否可以使用该对话框定义自定义颜色。
    如果允许用户自定义颜色,属性值为true,否则属性值为false。默认值为true。
    (2)FullOpen 属性:用来获取或设置一个值,该值指示用于创建自定义颜色的控件在对话框打开时是否
    可见。值为true时可见,值为 false时不可见。
    (3)AnyColor 属性:用来获取或设置一个值,该值指示对话框是否显示基本颜色集中可用的所有颜色。
    值为 true时,显示所有颜色,否则不显示所有颜色。
    (4)Color属性:用来获取或设置用户选定的颜色。
    21、PrintDialog控件和 PrintDocument 控件
    PrintDialog 控件在工具箱中的图标是 ,PrintDocument 控件在工具箱中的图标是
    。使用PrintDialog控件可以显示Windows标准的【打印】对话框,在该对话框中用户可
    以选择打印机、选择要打印的页及页码范围等。需要注意的是:该对话框并不负责具体的打印任务,要想
    在应用程序中控制打印内容必须使用 PrintDocument 控件。关于这两个控件的详细使用方法读者可参阅相
    关资料或VisualC#的帮助文件。
    6.用户自定义对话框
    除了可以使用Windows自带的标准对话框外,用户还可以把自己设计的窗体定义成对话框。使用自定义对
    话框有以下几个要点。
    (1)将窗体的FormBorderStyle属性值设置为FixedDialog。
    (2)根据需要向窗体上添加控件。
    (3)使用窗体的ShowDialog方法显示窗体,即显示出对话框。
    22、用户自定义对话框
    除了可以使用Windows自带的标准对话框外,用户还可以把自己设计的窗体定义成对话框。使用自定义对
    话框有以下几个要点。
    (1)将窗体的FormBorderStyle属性值设置为FixedDialog。
    (2)根据需要向窗体上添加控件。
    (3)使用窗体的ShowDialog方法显示窗体,即显示出对话框。

    23、菜单控件
    Windows 的菜单系统是图形用户界面(GUI)的重要组成之一,在 VisualC#中使用 MainMenu 控件可以很
    方便地实现Windows的菜单,MainMenu控件在工具箱中的图标为 。
    1.菜单的结构
    图 10-9和图10-10 是典型的菜单结构。其中有文字的单个命令称菜单项,顶层菜单项是横着排列的,单击
    某个菜单项后弹出的称为菜单或子菜单,它们均包含若干个菜单项,菜单项其实是 MenuItem 类的一个对
    象。菜单项有的是变灰显示的,表示该菜单项当前是被禁止使用的。有的菜单项的提示文字中有带下划线
    的字母,该字母称为热键(或访问键),若是顶层菜单,可通过按“ALT+热键”打开该菜单,若是某个子
    菜单中的一个选项,则在打开子菜单后直接按热键就会执行相应的菜单命令。有的菜单项后面有一个按键
    或组合键,称快捷键,在不打开菜单的情况下按快捷键,将执行相应的命令。在图 10-9 中,【保存文件】
    菜单项是加粗显示的,该菜单项称为默认项。图10-9的【另存为】和【退出】之间有一个灰色的线条,该
    线条称为分隔线或分隔符。在图 10-10 中菜单项【白色背景】前面有一个“√”号,称为选中标记,菜单

    项加上选中标记表示该菜单项代表的功能当前正在起作用。

    2.菜单项的常用属性
    (1)Text 属性:用来获取或设置一个值,通过该值指示菜单项标题。当使用 Text 属性为菜单项指定标题
    时,还可以在字符前加一个“&”号来指定热键(访问键,即加下划线的字母)。例如,若要将“File”中
    的“F”指定为访问键,应将菜单项的标题指定为“&File” 。
    (2)Checked属性:用来获取或设置一个值,通过该值指示选中标记是否出现在菜单项文本的旁边。如果
    要放置选中标记在菜单项文本的旁边,属性值为true,否则属性值为false。默认值为false。
    (3)DefaultItem 属性:用来获取或设置一个值,通过该值指示菜单项是否为默认菜单项。值为 true 时,
    是默认菜单项,值为 false时,不是默认菜单项。菜单的默认菜单项以粗体的形式显示。当用户双击包含默
    认项的子菜单后,默认项被选定,然后子菜单关闭。
    (4)Enabled属性:用来获取或设置一个值,通过该值指示菜单项是否可用。值为true时表示可用,值为
    false表示当前禁止使用。
    (5)RadioCheck 属性:用来获取或设置一个值,通过该值指示选中的菜单项的左边是显示单选按钮还是
    选中标记。值为true时将显示单选按钮标记,值为false时显示选中标记。
    (6)Shortcut属性:用来获取或设置一个值,该值指示与菜单项相关联的快捷键。
    (7)ShowShortcut 属性:用来获取或设置一个值,该值指示与菜单项关联的快捷键是否在菜单项标题的
    旁边显示。如果快捷组合键在菜单项标题的旁边显示,该属性值为 true,如果不显示快捷键,该属性值为
    false。默认值为true。
    (8)MdiList属性:用来获取或设置一个值,通过该值指示是否用在关联窗体内显示的多文档界面(MDI)
    子窗口列表来填充菜单项。若要在该菜单项中显示MDI子窗口列表,则设置该属性值为true,否则设置该
    属性的值为false。默认值为false。
    3.菜单项的常用事件
    菜单项的常用事件主要有Click事件,该事件在用户单击菜单项时发生。
    24、多窗体程序设计
    Windows应用程序很少只由一个窗体组成, 一般情况下一个应用程序均拥有很多个窗体。 C#项目刚建立时只有一个名为Form1的窗体,要建立多窗体应用程序应首先为项目添加窗体,添加窗体的方法如下。
    (1) 单击工具栏上的按钮 或执行【项目】→【添加Windows窗体】命令,将会出现如图 10-17 所示的【添加新项】对话框。
    (2) 在该对话框的【模板】下面的列表框中 选中【Windows 窗体】图标,在【名称】文本框中输入窗体名,然后单击【打开】按钮,即为应用程序添加了一个窗体。
    25、MDI 应用程序设计
    1.MDI应用程序的概念
    在前面的章节中,所创建的都是单文档界面(SDI)应用程序。这样的程序(如记事本和画图程序)仅支
    持一次打开一个窗口或文档。如果需要编辑多个文档,必须创建SDI应用程序的多个实例。而使用多文档
    界面(MDI)程序(如Word和AdobePhotoshop)时,用户可以同时编辑多个文档。MDI程序中的应用程
    序窗口称为父窗口,应用程序内部的窗口称为子窗口。虽
    然 MDI应用程序可以具有多个子窗口, 但是每个子窗口却
    只能有一个父窗口。此外,处于活动状态的子窗口最大数
    目是 1。子窗口本身不能再成为父窗口,而且不能移动到
    它们的父窗口区域之外。除此以外,子窗口的行为与任何
    其他窗口一样(如可以关闭、最小化和调整大小等)。一个
    子窗口在功能上可能与父窗口的其他子窗口不同,例如,
    一个子窗口可能用于编辑图像,另一个子窗口可能用于编
    辑文本,第 3 个子窗口可以使用图形来显示数据,但是所
    有的窗口都属于相同的MDI父窗口。图 10-19 是一个典型
    的 MDI应用程序。外面的窗口是应用程序窗口,里面的两
    个小窗口是 MDI子窗口。
    2.与 MDI应用程序设计有关的属性、方法和事件
    常用的MDI父窗体属性如下。
    (1)ActiveMdiChild属性:该属性用来表示当前活动的MDI子窗口,如果当前没有子窗口,则返回null。
    (2)IsMdiContainer属性:该属性用来获取或设置一个值,该值指示窗体是否为多文档界面(MDI)子窗
    体的容器,即MDI父窗体。值为true时,表示是父窗体,值为false时,表示不是父窗体。
    (3)MdiChildren属性:该属性以窗体数组形式返回MDI子窗体,每个数组元素对应一个 MDI子窗体。
    常用的MDI子窗体的属性有:
    (1)IsMdiChild属性:该属性用来获取一个值,该值指示该窗体是否为多文档界面(MDI)的子窗体。值
    为 true时,表示是子窗体,值为false时,表示不是子窗体。
    (2)MdiParent属性:该属性用来指定该子窗体的MDI父窗体。与MDI应用程序设计有关的方法中,一
    般只使用父窗体的LayoutMdi方法,该方法的调用格式如下:
    MDI父窗体名.LayoutMdi(Value);
    该方法用来在MDI父窗体中排列MDI子窗体,以便导航和操作MDI子窗体。参数Value决定排列方式,
    取值有:MdiLayout.ArrangeIcons(所有 MDI 子窗体以图标的形式排列在 MDI 父窗体的工作区内)、
    MdiLayout.TileHorizontal (所有MDI子窗口均水平平铺在MDI父窗体的工作区内)、 MdiLayout.TileVertical
    (所有 MDI 子窗口均垂直平铺在 MDI 父窗体的工作区内)和 MdiLayout.Cascade(所有 MDI 子窗口均层
    叠在 MDI 父窗体的工作区内)。常用的 MDI 父窗体的事件是 MdiChildActivate,当激活或关闭一个 MDI
    子窗体时将发生该事件。
    3.菜单合并
    父窗体和子窗体可以使用不同的菜单,这些菜单会在选择子窗体的时候合并。如果需要指定菜单的合并方
    式,程序员可以设置每个菜单项的MergeOrder属性和MergeType属性。

    (1)MergeOrder属性:用来确定当两个菜单合并时菜单项出现的顺序,具有较低
    MergeOrder的菜单项会首先出现。
    (2)MergeType属性:当合并的两个菜单的某些菜单项的MergeOrder属性值相等时,
    使用该属性可以控制这些菜单项的显示方式。其取值及含义如表10-4所示。

    26、键盘事件处理
    键盘事件在用户按下键盘上的键时发生,可分为两类。第一类是KeyPress事件,当按下的键表示的是一个
    ASCII 字符时就会触发这类事件,可通过它的 KeyPressEventArgs 类型参数的属性 KeyChar 来确定按下键
    的 ASCII 码。使用 KeyPress 事件无法判断是否按下了修改键(例如 Shift,Alt 和 Ctrl 键),为了判断这些
    动作, 就要处理KeyUp 或KeyDown事件, 这些事件组成了第二类键盘事件。 该类事件有一个KeyEventArgs
    类型的参数,通过该参数可以测试是否按下了一些修改键、功能键等特殊按键信息。
    1.KeyPressEventArgs类的主要属性(KeyPress事件的一个参数类型)
    (1)Handled属性:用来获取或设置一个值,该值指示是否处理过KeyPress事件。
    (2)KeyChar属性:用来获取按下的键对应的字符,通常是该键的ASCII码。
    2.KeyEventArgs类的主要属性(KeyUp和 KeyDown事件的一个参数)
    (1)Alt属性:用来获取一个值,该值指示是否曾按下Alt键。
    (2)Control属性:用来获取一个值,该值指示是否曾按下Ctrl键。
    (3)Shift属性:用来获取一个值,该值指示是否曾按下Shift键。
    (4)Handled属性:用来获取或设置一个值,该值指示是否处理过此事件。
    (5)KeyCode属性:以 Keys枚举型值返回键盘键的键码,该属性不包含修改键(Alt、Control和 Shift键)
    信息,用于测试指定的键盘键。
    (6)KeyData 属性:以 Keys 枚举类型值返回键盘键的键码,并包含修改键信息,用于判断关于按下键盘
    键的所有信息。
    (7)KeyValue属性:以整数形式返回键码,而不是Keys枚举类型值。用于获得所按下键盘键的数字表示。
    (8)Modifiers 属性:以 Keys 枚举类型值返回所有按下的修改键(Alt、Control 和 Shift 键),仅用于判断
    修改键信息。
    27、鼠标事件处理
    对鼠标操作的处理是应用程序的重要功能之一,在VisualC#中有一些与鼠标操作相关的事件,利用它们可
    以方便地进行与鼠标有关的编程。
    (1)MouseEnter事件:在鼠标指针进入控件时发生。
    (2)MouseMove事件:在鼠标指针移到控件上时发生。事件处理程序接收一个MouseEventArgs类型的参
    数,该参数包含与此事件相关的数据。该参数的主要属性及其含义如下。
    Button属性:用来获取曾按下的是哪个鼠标按钮。该属性是MouseButtons枚举型的值,
    取值及含义如下:Left(按下鼠标左按钮)、Middle(按下鼠标中按钮)、Right(鼠标右按钮)、None(没
    有按下鼠标按钮)、 XButton1 (按下了第一个XButton按钮, 仅用于Microsoft智能鼠标浏览器) 和XButton2

    (按下了第二个XButton按钮,仅用于 Microsoft智能鼠标浏览器)
    Clicks属性:用来获取按下并释放鼠标按钮的次数。
    Delta属性:用来获取鼠标轮已转动的制动器数的有符号计数。制动器是鼠标轮的一个凹口。
    X 属性:用来获取鼠标所在位置的x坐标。
    Y 属性:用来获取鼠标所在位置的y坐标。
    (3)MouseHover事件:当鼠标指针悬停在控件上时将发生该事件。
    (4)MouseDown事件:当鼠标指针位于控件上并按下鼠标键时将发生该事件。事件处理程序也接收一个
    MouseEventArgs类型的参数。
    (5)MouseWheel事件:在移动鼠标轮并且控件有焦点时将发生该事件。该事件的事件处理程序接收一个
    MouseEventArgs类型的参数
    (6)MouseUp 事件:当鼠标指针在控件上并释放鼠标键时将发生该事件。事件处理程序也接收一个
    MouseEventArgs类型的参数。

    (7)MouseLeave事件:在鼠标指针离开控件时将发生该事件。

    展开全文
  • 前言 工作三年有余,年纪大了专业技能到没长进,有时候闲的时候总想写点东西出来,由于自己的懒惰一直拖拖拉拉...emmm,参考的是小红书编辑页的标签效果, 拿在手里玩了一会,标签可以跟随手指移动,当前拖动的标签...

    前言

    工作三年有余,年纪大了专业技能到没长进,有时候闲的时候总想写点东西出来,由于自己的懒惰一直拖拖拉拉,好几次还没开始就放弃了,大家也都知道,学编程的大多数不善于表达,加上自己的专业技能确实不怎么样。这次因缘巧合之下正好负责迭代版本中的控件部分,于是就有了控件人生系列文章。

    先来看看两张效果图:
    在这里插入图片描述在这里插入图片描述
    emmm,参考的是小红书编辑页的标签效果, 拿在手里玩了一会,标签可以跟随手指移动,当前拖动的标签覆盖在其他标签之上,还可以挤压,切换标签方向,拖到删除区域手指放开标签被移除。。。玩着,玩着却让我玩出了一个bug,捂脸:当有7,8张图片时(图片切换是以viewpager实现),在第一张图片添加标签,然后来回切换viewpager,标签的位置会错乱。。。

    初步分析

    先看看小红书的效果:
    在这里插入图片描述在这里插入图片描述
    emmm,从效果上看呢,并不复杂,主要是细节的处理。接下来我们具体一步一步分析,从而打造属于我们自己的效果。

    仔细观察,你会发现:

    • 标签跟随手指移动并且当前所触摸的标签位于其他标签之上;

    • 标签不能移出图片区域(除下方向外),同时手指按下与抬起,删除区域显示与隐藏(暴露接口);

    • 当标签超过一定的长度,移动到图片边缘,标签出现挤压效果;

    • 点击呼吸灯区域(横躺的棒棒糖),切换标签方向;

    • 当前图片添加标签后,再次切回当前图片,标签数据依旧存在(保存与恢复);

    好,现在我们基本分析的差不多了,下面开始构思代码。

    构思代码

    标签有添加与移除,自然会想到ViewGroup,同时ViewGroup的宽高需与图片保持一致,标签可能在ViewGroup的任意位置,那么就需要标签动态改变Translation值,怎么样才能让当前触摸的标签位于其他标签之上?大家都知道ViewGroup的子view索引值越大越能显示在屏幕的前面。那么当手指触摸到标签时,就需要改变子View的索引值,可ViewGroup并没有提供直接改变子View索引值的方法。父类直接添加会报父类已存在的异常,那么我可不可以先移除,再添加到ViewGroup的最后面,这方案不错,最终也是按着这个方案来实现的。

    在最开始的两张效果图中,产品还有这样一个需求:需要拖动标签到屏幕底部【移动到此处】进行删除。刚刚已经分析了标签的父控件大小与图片一致,考虑到视图层级的关系,标签移出父控件,可能会出现被其他View遮挡的现象,那又怎么样才能不让遮挡呢?

    还记不记得很早以前的自定义View之案列篇(三):仿QQ小红点呢?父控件默认裁剪子view,那么可以通过:

    	android:clipChildren="false"
    

    设置父控件不裁剪。
    在这里插入图片描述
    在上文中提到,当标签超过一定的长度,移动到图片边缘,标签出现挤压效果。记得在漫画播放器一吐槽功能中已经实现了类似的功能。

    那个思路也能用到这里来:动态改变控件的宽度,就能实现文字的挤压效果。

    还有一个效果:点击呼吸灯区域,切换标签方向。说说最开始的实现思路:左右标签分别是两个xml布局文件,切换方向的时候,通过inflate来加载对应的xml文件实现方向的切换。每次切换方向都会重新加载xml文件,这样效率并不高。没想到我这样的年轻司机也有翻车的时候啊,哈哈。后来,细细一折磨,为何不把左右标签放在一个xml文件,通过隐藏显示控制标签方向,哈哈,好家伙,效率比两个xml文件好很多。

    接下来,开工写代码洛~~

    起名字

    起名字一直是一门艺术,一个好的控件必须有一个好的名字,我看就叫:RandomDragTagLayout(标签父控件)RandomDragTagView(标签控件)

    编写代码

    RandomDragTagView

    先来看看标签的xml布局文件(R.layout.random_tag_layout):

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <!-- 左侧标签 -->
        <LinearLayout...>
    
        <View
            android:id="@+id/left_line_view"
            android:layout_width="13.5dp"
            android:layout_height="1dp"
            android:layout_gravity="center_vertical"
            android:layout_marginRight="-3.5dp"
            android:background="#FFFFFF"></View>
    
        <!-- 中点呼吸灯 -->
        <FrameLayout...>
    
        <View
            android:id="@+id/right_line_view"
            android:layout_width="13.5dp"
            android:layout_height="1dp"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="-3.5dp"
            android:background="#FFFFFF"></View>
    
        <!-- 右侧标签 -->
        <LinearLayout...>
    
    </LinearLayout>
    

    xml的预览效果图:
    在这里插入图片描述
    好,xml布局文件比较简单,接着我们来看看RandomDragTagView应该怎么写:
    RandomDragTagView类继承LinearLayout,先是成员变量:

    
        // 左侧视图
        private LinearLayout mLeftLayout;
        private TextView mLeftText;
        private View mLeftLine;
        // 右侧视图
        private LinearLayout mRightLayout;
        private TextView mRightText;
        private View mRightLine;
        // 中间视图
        private View mBreathingView;
        private FrameLayout mBreathingLayout;
    
        // 是否显示左侧视图  默认显示左侧视图
        private boolean mIsShowLeftView = true;
    
        // 呼吸灯动画
        private ValueAnimator mBreathingAnimator;
        // 回弹动画
        private ValueAnimator mReboundAnimator;
        private float mStartReboundX;
        private float mStartReboundY;
        private float mLastMotionRawY;
        private float mLastMotionRawX;
    
        // 是否多跟手指按下
        private boolean mPointerDown = false;
        private int mTouchSlop = -1;
    
        // 是否可以拖拽
        private boolean mCanDrag = true;
    
        // 是否可以拖拽出父控件区域
        private boolean mDragOutParent = true;
    
        // 父控件最大的高度
        private int mMaxParentHeight = 0;
    
        // 最大挤压宽度 默认400
        private int mMaxExtrusionWidth = 400;
        // 文本圆角矩形的最大宽度
        private int mMaxTextLayoutWidth = 0;
    
        // 删除标签区域的高度
        private int mDeleteRegionHeight;
    
        // 暴露接口
        private boolean mStartDrag = false;
        private OnRandomDragListener mDragListener;
    

    再到一参,二参,三参的构造方法,参数的话,Context,attrs,defStyleAttr是不用说了,一参,二参指向三参构造:

        public RandomDragTagView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            setOrientation(HORIZONTAL);
            inflate(context, R.layout.random_tag_layout, this);
            initView();
            initListener();
            initData();
            startBreathingAnimator();
        }
    

    initView,initListener方法也不用说了,用于初始化控件与事件监听的方法。initData方法隐藏右侧标签部分,而startBreathingAnimator方法用于开启呼吸灯动画,在效果中,呼吸灯有来回缩放的效果,就好似一呼一吸。

        // 开启呼吸灯动画 注动画无线循环注意回收防止内存泄露
        private void startBreathingAnimator() {
            if (mBreathingAnimator != null && mBreathingAnimator.isRunning()) {
                mBreathingAnimator.cancel();
                mBreathingAnimator = null;
            }
            mBreathingAnimator = ValueAnimator.ofFloat(0.8F, 1.0F);
            mBreathingAnimator.setRepeatMode(ValueAnimator.REVERSE);
            mBreathingAnimator.setDuration(800);
            mBreathingAnimator.setStartDelay(200);
            mBreathingAnimator.setRepeatCount(-1);
            mBreathingAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    float value = (float) animation.getAnimatedValue();
                    mBreathingView.setScaleX(value);
                    mBreathingView.setScaleY(value);
                }
            });
            mBreathingAnimator.start();
        }
    

    注意呼吸灯动画设置了setRepeatCount重复次数为-1,表示无限循环。onAnimationUpdate方法会被一直调用,同时方法内部持有mBreathingView的引用,最终会导致mBreathingView所属的activity被持有无法回收,从而引起内存泄露。

    那么我们需要在合适的时机调用动画cancel并置为null,就像这样:

        @Override
        protected void onDetachedFromWindow() {
            if (mBreathingAnimator != null && mBreathingAnimator.isRunning()) {
                mBreathingAnimator.cancel();
                mBreathingAnimator = null;
            }
            super.onDetachedFromWindow();
        }
    

    标签的默认效果,就像这样:
    在这里插入图片描述
    好了,在效果中标签跟随手指移动,重写onTouchEvent方法,在触发拖动事件时,我们需要对一些数值进行初始化并改变标签在父控件中的索引值,让当前所触摸的标签显示在其他标签之上:

       switch (event.getActionMasked()) {
           case MotionEvent.ACTION_DOWN:
               final float x = event.getRawX();
               final float y = event.getRawY();
               // 允许父控件不拦截事件
               getParent().requestDisallowInterceptTouchEvent(true);
               mStartDrag = false;
               mPointerDown = false;
               mLastMotionRawX = x;
               mLastMotionRawY = y;
               mStartReboundX = getTranslationX();
               mStartReboundY = getTranslationY();
               // 调整索引 位于其他标签之上
               adjustIndex();
               break;
    

    adjustIndex方法用于调整索引:

        /**
         * 调整索引 位于其他标签之上
         */
        private void adjustIndex() {
            ViewParent parent = getParent();
            if (parent != null) {
                if (parent instanceof ViewGroup) {
                    ViewGroup parentView = (ViewGroup) parent;
                    int childCount = parentView.getChildCount();
                    if (childCount > 1 && indexOfChild(this) != (childCount - 1)) {
                        parentView.removeView(this);
                        parentView.addView(this);
                        // 重新开启呼吸灯动画
                        startBreathingAnimator();
                    }
                }
            }
        }
    

    emmmm,接下来到移动了,更新当前触摸坐标值,根据坐标值偏移量来动态设置setTranslation,同时对越界,挤压处理:

        case MotionEvent.ACTION_MOVE:
            final float rawY = event.getRawY();
            final float rawX = event.getRawX();
            if (!mStartDrag) {
                mStartDrag = true;
                if (mDragListener != null) {
                    mDragListener.onStartDrag();
                }
            }
            if (!mPointerDown) {
                final float yDiff = rawY - mLastMotionRawY;
                final float xDiff = rawX - mLastMotionRawX;
                // 处理move事件
                handlerMoveEvent(yDiff, xDiff);
                mLastMotionRawY = rawY;
                mLastMotionRawX = rawX;
            }
            break;
    

    首先暴露开始拖动的接口回调,有同学就会有疑问为啥不在事件ACTION_DOWN中回调呢?主要是因为,观察小红书快速点击也没有执行开始拖动的回调。还有这里的回调判定并不是很合理,如果能够加上mTouchSlop,那就再好不过呢。不要问我为什么不加,懒呗

    mPointerDown参数主要用来控制是否有多根手指按下,同样也是观察小红书,在多根手指按下的情况下,标签并没有跟随手指移动,只有在单根手指的情况才会移动。

    那么mPointerDown在多根手指按下与抬起的事件中更新状态:

       // 多根手指按下
       case MotionEvent.ACTION_POINTER_DOWN:
           mPointerDown = true;
           break;
      // 多根手指抬起     
      case MotionEvent.ACTION_POINTER_UP:
           mPointerDown = false;
           break;
    

    接下来对越界与挤压的处理:

        /**
         * 处理手势的move事件
         *
         * @param yDiff y轴方向的偏移量
         * @param xDiff x轴方向的偏移量
         */
        private void handlerMoveEvent(float yDiff, float xDiff) {
            float translationX = getTranslationX() + xDiff;
            float translationY = getTranslationY() + yDiff;
    
            // 越界处理 最大最小原则
            int parentWidth = ((View) getParent()).getWidth();
            int parentHeight = ((View) getParent()).getHeight();
            if (mMaxParentHeight == 0) {
                int parentParentHeight = ((View) getParent().getParent()).getHeight();
                mMaxParentHeight = (mDragOutParent ? parentParentHeight : parentHeight) - getHeight();
            }
            int maxWidth = parentWidth - getWidth();
    
            // 分情况处理越界 宽度
            if (translationX <= 0) {
                translationX = 0;
                // 标签文本出现挤压效果
                if (isShowLeftView()) {
                    extrusionTextRegion(xDiff);
                }
            } else if (translationX >= maxWidth) {
                translationX = maxWidth;
                // 右侧挤压
                if (!isShowLeftView()) {
                    extrusionTextRegion(-xDiff);
    
                    handleWidthError();
                }
            } else {
                int textWidth = isShowLeftView() ? mLeftLayout.getWidth() : mRightLayout.getWidth();
                // 左侧视图
                if (isShowLeftView()) {
                    if (getTranslationX() == 0 && textWidth < mMaxTextLayoutWidth) {
                        translationX = 0;
                        extrusionTextRegion(xDiff);
                    }
                } else {
                    if (textWidth < mMaxTextLayoutWidth) {
                        extrusionTextRegion(-xDiff);
                        handleWidthError();
                    }
                }
            }
    
            // 高度越界处理
            if (translationY <= 0) {
                translationY = 0;
            } else if (translationY >= mMaxParentHeight) {
                translationY = mMaxParentHeight;
            }
    
            setTranslationX(translationX);
            setTranslationY(translationY);
        }
    

    在上文中已经提到过,产品新增标签可以拖出父控件底部区域(小红书不允许),不要问我为什么,三个字:产品最大。

    作为一名程序猿,必须保证代码的健壮性,同时也为了防止产品哪天提出:不允许拖出父控件的底部区域的需求?

    那就需要一个标识来标识是否拖出父控件底部区域,这就是mDragOutParent参数的由来。根据标识获取到父控件的最大高度mMaxParentHeight,用于后面的越界处理。

    观察小红书的挤压是分情况来处理的:

    • 标签在呼吸灯的左侧,只能向左挤压。挤压的条件,1、标签长度大于一定值;2、标签靠在父控件左侧边缘,手指并向左侧拖动。

    • 标签在呼吸灯的右侧,只能向右挤压。挤压条件同上。

    • 有挤压就有拉伸,与上面两种情况正好相反,标签在呼吸灯左侧只能向右拉伸;右侧只能向左拉伸。拉伸的条件,1、标签长度小于最大值;2、标签靠在父控件的左、右边缘同时向相反的方向拖动。

    挤压拉伸的方法如下:

        /**
         * 挤压拉伸文本区域
         *
         * @param deltaX 偏移量
         */
        private void extrusionTextRegion(float deltaX) {
            int textWidth = isShowLeftView() ? mLeftLayout.getWidth() : mRightLayout.getWidth();
            LinearLayout.LayoutParams lp = (LayoutParams) (isShowLeftView() ?
                    mLeftLayout.getLayoutParams() : mRightLayout.getLayoutParams());
            if (textWidth >= mMaxExtrusionWidth) {
                lp.width = (int) (textWidth + deltaX);
    
                // 越界判定
                if (lp.width <= mMaxExtrusionWidth) {
                    lp.width = mMaxExtrusionWidth;
                } else if (lp.width >= mMaxTextLayoutWidth) {
                    lp.width = mMaxTextLayoutWidth;
                }
    
                if (isShowLeftView()) {
                    mLeftLayout.setLayoutParams(lp);
                } else {
                    mRightLayout.setLayoutParams(lp);
                }
            }
        }
    

    注意:由于文本控件宽度改变,文本显示的字符数会发生变化,字符数的增减会导致文本宽度与deltaX不一致,导致标签在呼吸灯右侧挤压拉伸有几率并没有靠在右侧边缘。 所以有了以下的兼容误差处理:

        // 处理宽度误差
        private void handleWidthError() {
            post(new Runnable() {
                @Override
                public void run() {
                    int parentWidth = ((View) getParent()).getWidth();
                    int maxWidth = parentWidth - getWidth();
                    setTranslationX(maxWidth);
                }
            });
        }
    

    处理完了挤压与拉伸,就剩下高度的越界处理与改变setTranslation值:

        // 高度越界处理
        if (translationY <= 0) {
            translationY = 0;
        } else if (translationY >= mMaxParentHeight) {
            translationY = mMaxParentHeight;
        }
        setTranslationX(translationX);
        setTranslationY(translationY);
    

    来,看看效果:
    在这里插入图片描述
    好,ACTION_MOVE处理完,到ACTION_UP了。根据getTranslationY值来判定标签是否滑出父控件区域,如果滑动到删除区域,则移除标签控件;如果滑出图片区域并没有滑到删除区域(上图的黑色区域),则开始回弹动画。最后暴露结束拖动的回调。

    case MotionEvent.ACTION_UP:
        mPointerDown = false;
        mStartDrag = false;
        getParent().requestDisallowInterceptTouchEvent(false);
        
        final float translationY = getTranslationY();
        final int parentHeight = ((View) getParent()).getHeight();
        
        if (mMaxParentHeight - mDeleteRegionHeight < translationY) {
            removeTagView();
        } else if (parentHeight - getHeight() < translationY) {
            startReBoundAnimator();
        }
        
        if (mDragListener != null) {
            mDragListener.onStopDrag();
        }
        break;
    

    回弹动画以手指按下与抬起为开始与结束点进行平移,代码非常简单:

        // 开始回弹动画
        private void startReBoundAnimator() {
            if (mReboundAnimator != null && mReboundAnimator.isRunning()) {
                mReboundAnimator.cancel();
            }
            mReboundAnimator = ValueAnimator.ofFloat(1F, 0F);
            mReboundAnimator.setDuration(400);
            final float startTransX = getTranslationX();
            final float startTransY = getTranslationY();
            mReboundAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    float value = (float) animation.getAnimatedValue();
                    setTranslationX(mStartReboundX + (startTransX - mStartReboundX) * value);
                    setTranslationY(mStartReboundY + (startTransY - mStartReboundY) * value);
                }
            });
            mReboundAnimator.start();
        }
    

    对了,还有一功能,点击呼吸灯切换标签方向:

        // 切换方向
        public void switchDirection() {
            mIsShowLeftView = !mIsShowLeftView;
            visibilityLeftLayout();
            visibilityRightLayout();
    
            // 第一步更改 重置 textLayout 的高度
            final int preSwitchWidth = getWidth();
            LinearLayout.LayoutParams lp = (LayoutParams) (isShowLeftView() ?
                    mLeftLayout.getLayoutParams() : mRightLayout.getLayoutParams());
            lp.width = LayoutParams.WRAP_CONTENT;
            if (mIsShowLeftView) {
                mLeftText.setText(mRightText.getText());
                mLeftLayout.setLayoutParams(lp);
            } else {
                mRightText.setText(mLeftText.getText());
                mRightLayout.setLayoutParams(lp);
            }
    
            post(new Runnable() {
                @Override
                public void run() {
                    // 第二步 重新设置setTranslationX的值
                    float newTranslationX = 0;
                    if (!isShowLeftView()) {
                        newTranslationX = getTranslationX() + preSwitchWidth - mBreathingView.getWidth();
                    } else {
                        newTranslationX = getTranslationX() - getWidth() + mBreathingView.getWidth();
                    }
    
                    // 边界检测
                    checkBound(newTranslationX, getTranslationY());
    
                }
            });
        }
    

    首先根据标签方向,显示与隐藏左右标签视图;然后给标签设置文本,同时重置标签的宽度属性;接着重新设置标签的setTranslationX值,最后边界检测。

    边界检测方法代码如下:

        /**
         * @param newTranslationX  
         * @param newTranslationY
         */
        private void checkBound(float newTranslationX, float newTranslationY) {
            setTranslationX(newTranslationX);
    
            // 越界的情况下 改变textLayout 的高度
            final int parentWidth = ((View) getParent()).getWidth();
            final int parentHeight = ((View) getParent()).getHeight();
            float translationX = getTranslationX();
            if (translationX <= 0) {
                extrusionTextRegion(translationX);
            } else if (getTranslationX() >= (parentWidth - getWidth())) {
                final float offsetX = getWidth() - (parentWidth - getTranslationX());
                extrusionTextRegion(-offsetX);
    
                // 越界检测
                post(new Runnable() {
                    @Override
                    public void run() {
                        if (getTranslationX() >= (parentWidth - getWidth())) {
                            setTranslationX(parentWidth - getWidth());
                        }
                    }
                });
            }
    
            // 越界检测
            if (getTranslationX() <= 0) {
                setTranslationX(0);
            }
    
            if (newTranslationY <= 0) {
                newTranslationY = 0;
            } else if (newTranslationY >= parentHeight - getHeight()) {
                newTranslationY = parentHeight - getHeight();
            }
    
            setTranslationY(newTranslationY);
        }
    

    针对方法流程,并没有细讲,如果有疑问,请给我留言。让我们一起看看标签切换的效果图:
    在这里插入图片描述
    RandomDragTagView还有一些暴露数据的方法,这里就不一一列出了。

    RandomDragTagLayout

    RandomDragTagLayout类继承FrameLayout,只有一个方法:

        /**
         * 添加标签
         *
         * @param text           标签文本
         * @param x              相对于父控件的x坐标百分比
         * @param y              相对于父控件的y坐标百分比
         * @param isShowLeftView 是否显示左侧标签
         */
        public boolean addTagView(String text, final float x, final float y, boolean isShowLeftView) {
            if (text == null || text.equals("")) return false;
            RandomDragTagView tagView = new RandomDragTagView(getContext());
            addView(tagView, new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            tagView.initTagView(text, x * getWidth(), y * getHeight(), isShowLeftView);
            return true;
        }
    

    保存、恢复

    保存,新建TagModel 类用于保存标签属性:

        private void saveTag() {
            mTagList.clear();
            for (int i = 0; i < mRandomDragTagLayout.getChildCount(); i++) {
                View childView = mRandomDragTagLayout.getChildAt(i);
                if (childView instanceof RandomDragTagView) {
                    RandomDragTagView tagView = (RandomDragTagView) childView;
                    TagModel tagModel = new TagModel();
                    tagModel.direction = tagView.isShowLeftView();
                    tagModel.text = tagView.getTagText();
                    tagModel.x = tagView.getPercentTransX();
                    tagModel.y = tagView.getPercentTransY();
                    mTagList.add(tagModel);
                }
            }
        }
    

    恢复:

        private void restoreTag() {
            if (!mTagList.isEmpty()) {
                mRandomDragTagLayout.removeAllViews();
                for (TagModel tagModel : mTagList) {
                    mRandomDragTagLayout.addTagView(tagModel.text, tagModel.x, tagModel.y, tagModel.direction);
                }
            }
        }
    

    最后让我们用一张动图,来感受标签控件的强大:
    在这里插入图片描述

    好了,本篇文章到此结束,有错误的地方请指出,多谢~

    Github地址:https://github.com/HpWens/MeiWidgetView 欢迎Star

    qrcode_for_gh_232b5a56667d_258.jpg

    扫一扫 关注我的公众号
    新号希望大家能够多多支持我~
    展开全文
  • Winform常用控件及其属性

    千次阅读 2019-09-21 21:53:34
    常用控件属性: 常用控件 Form窗体 Label标签 TextBox文本框 ComboBox组合框 (就是有下拉列表的叫组合框) ListBox列表框 (多行文本框) MenuStrip菜单栏 ToolStripMenuItem菜单项 ToolStrip工具栏 ...
  • WinForm控件属性大全

    千次阅读 多人点赞 2020-04-20 19:03:17
    C#控件及常用设计整 1、窗体... 1 2、Label 控件... 3 3、TextBox 控件... 4 4、RichTextBox控件... 5 5、NumericUpDown 控件... 7 6、Button 控件... 7 7、GroupBox 控件... 7 8、RadioButton控件... 8 9...
  • android 控件属性大全

    千次阅读 多人点赞 2018-06-06 16:26:59
    “Android控件属性大全”: &nbsp; 关键词:android&nbsp;控件&nbsp;属性&nbsp;大全 &nbsp; &nbsp; 控件属性: android属性 android功能强大,界面华丽,但是众多的布局属性就害苦了开发者...
  • HTML中的常用表单控件属性

    千次阅读 2019-12-09 11:52:15
    action属性 定义表单数据提交地址 method属性 定义表单提交方式,一般为get或post方式 <label>标签 为表单元素定义文字标注 for属性:提高用户体验度,点击label中的内容自动激活与该标签绑定的控件 <...
  • 表单的结构表单的基本概念form的属性nameactionmethod其他属性表单控件的类型form表单示例相关概念选择题及参考答案选择题参考答案 表单的基本概念 表单是收集用户数据的容器。一个表单通常由表单控件和相关的提示...
  • VB控件属性大全

    万次阅读 多人点赞 2018-06-14 08:54:57
    21.02、标签控件(Lable)的常用属性... 71.03、文本框控件(TextBox)的常用属性... 91.04、框架控件(Frame)的常用属性... 131.05、命令按钮控件(CommandButton)的常用属性... 151.06、复选框控件(CheckBox)的常用属性...
  • form表单标签控件

    千次阅读 2020-04-02 16:10:37
    form标签定义及用法 在html中,标签是使用来创建供用户输入的...form标签中通常会有很多子元素,用来定义各种交互控件(文本字段、复选框、单选框、提交按钮等等),比如< input>、< button>、< sele...
  • C++MFC控件属性的解释

    千次阅读 2018-04-03 13:21:12
    控件工具箱: 1 图形控件(picture):常用于显示位图(Bitmap)和图标(Icon)2 静态文本(Static Text):用来在指定的位置显示特定的字符串,一般用来标识附近另一个控件的内容。显示在静态文本控件中的字符串...
  • Visual Studio开发环境介绍 及控件属性、事件

    千次阅读 多人点赞 2019-10-01 16:02:13
    2、控件的基本属性 3、窗体 4、标签 5、图像框 6、文本框 7、命令按钮 8、综合实验 1、创建新项目 可通过文件->新建->项目 命令来创建一个新的Windows程序 在这里选择创建了一个Windows窗口程序 ...
  • win32api.FindWindows()第二,获得窗体中控件的id号,spy++第三,根据控件的ID获得控件的句柄(hwnd) GetDlgItem(hwnd,loginID)最后,利用控件句柄进行操作python可以通过win32api轻松获取控件属性值通过标签找到主...
  • 1.TextBox文本框控件属性及方法 TextBox文本框控件属性及方法 项目 说明 属性 MaxLength 可在文本框中输入最大字符数 Multilne 表示是否可在文本框中输入多行文本 Passwordchar ...
  • Android常用控件及其属性

    千次阅读 2016-05-11 18:04:28
    match_parent表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小 wrap_content表示让当前控件的大小能够刚好包含住里面的内容也就是由控件内容决定当前控件的大小 TextView TextView中...
  • HTML5教程 audio标签属性详解

    千次阅读 2020-12-22 04:01:08
    本篇教程探讨了HTML5教程 audio标签属性详解,希望阅读本篇文章以后大家有所收获,帮助大家...controls:值为controls,如果出现该属性,则向用户显示控件,比如播放按钮。loop:值为loop,如果出现该属性,则每当...
  • C# 中chart 控件各个属性和方法介绍

    千次阅读 2018-09-21 22:31:01
    //设置是否自动将数据值均为正值时轴的最小值设置为0,存在负数据值时,将使用数据轴最小值  Chart1.ChartAreas["图表区域"].AxisY.LabelStyle.Font = new System.Drawing.Font("Trebuchet MS", 8.25F, System....
  • 在 Windows 应用程序中很多控件都提供了 DataSource 属性,并将 DataSet 或 DataTable 的值直接赋给该属性,这样在控件中即可显示从数据库中查询出来的数据 常用的数据绑定控件有文本框(TextBox)、标签...
  • form元素只是一个数据获取元素的容器,而容器内的元素称为表单控件。最常用的表单控件是input元素 accept、alt、checked、disabled、maxlength、name、readonly、size、src、type、value这11个属性是input元素的传统...
  • C# 数据源以及数据控件的使用

    千次阅读 2019-12-21 16:19:03
    以连接数据库并显示为列子,我还用了2个数据控件更好地理解一些常用属性数据源在这里,这里我选的是Sql的 然后对数据源进行配置: 先右键数据库的服务器属性(右边那个就是服务属性,我这里是DES开头) 右键...
  • ActiveX控件属性:自定义属性的使用

    千次阅读 2017-08-22 10:06:23
    这个时候传统的配置文件已经无法满足这种类型的需求了,往往的做法是在初始化控件的时候即做了相应的初始化,然后对自身的功能做了限制或者给使用方反馈,所以常常看到的是html标签中出现这样的写法: ...
  • 前面两节讲了树形控件Tree Control,本节开始讲解标签控件Tab Control,也可以称为选项卡控件。  标签控件简介  标签控件也比较常见。它可以把多个页面集成到一个窗口中,每个页面对应一个标签,用户点击...
  • 在参数面板添加一个标签控件,控件名为lable,设置标签控件不可见,控件值为“显示”。 在参数面板添加一个按钮控件,控件名为button,控件值为“只显示合计数据”,并添加点击事件。 编辑点击事件,添加下面的...
  • 金蝶EAS-BOS一些常用控件属性方法

    千次阅读 2019-08-06 11:01:15
    最近在金蝶实习,进行EAS开发,一些控件属性都不是很熟悉,网上看到一篇博客, 刚好概括得很全,转载一下供需要时可以查阅。 种类 名称 说明 CombBox addItem 将枚举的值加入下拉列表选项 CombBox ...
  • 数据控件及其应用

    2012-11-23 16:26:19
    根据实验设计需要在窗体上放上若干所需的标签控件,文本框控件,图片框,命令按钮等,并设置各控件的必要属性值。 3.在窗体适当位置放置一个数据控件(Data),首先设置该数据控件的Connect,DatabaseName和...
  • View属性(视图属性) ... Details - 可以细节显示,但只有第一列可以包含一个小图标和标签,并且 第一列不可以设置居中属性。 Tile - 每个项都显示为一个完整大小的图标,标签居右。 常用属...
  • HTML input控件

    万次阅读 多人点赞 2018-04-12 21:41:48
    可以在 form 元素的开始标签和结束标签之间,添加 input 元素来创建 input 控件。input 元素是一个带有属性的空元素,格式为:&lt;input type="" name="" value="" /&gt;其中...
  • 表单标签的作用、常用的表单控件

    千次阅读 2019-04-30 14:42:25
    作用:将客户端的数据提交给服务器,(表单是客户与服务器交互的一种方式)。 可见性:在网页上是不可见的。 1.2 form常用的属性 Form标签是表单标签的一个根标签 1.3 get与post在格式上的区别 提交方式 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,102
精华内容 40,040
关键字:

属于标签控件的数据属性的是