8.4 容器2

发布于:2025-04-12 ⋅ 阅读:(40) ⋅ 点赞:(0)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的

8.4.3 TabControl(选项卡)控件

TabControl控件可以通过设置多个选项卡页(TabPage控件)把不同的控件显示到不同的页面,每个选项卡页都相当于一个容器,可以向里面添加其它控件,但同一时刻只能显示其中一个选项卡页。

TabControl控件比较常见,比如windows系统下的文件夹选项,将常规、查看、搜索对应的设置划分到了不同的功能区域:

图8-87 【文件夹选项】窗口提供了三个选项卡将功能进行分组

TabControl分为上下两部分,默认情况下,上部分包含了2个选项卡按钮,下面是TabPage,点击选项卡按钮,下面部分即可切换到对应的TabPage显示。鼠标单击上部分的选项卡按钮或是空白部分,编辑器右侧的【属性】窗口即刻切换到TabControl属性;鼠标单击TabPage部分,编辑器右侧的【属性】窗口即刻切换到相应的TabPage属性。

图8-88 此时选中的是TabPage2

TabControl常用属性:

  1. Appearance:选项卡的可视外观。
  2. Alignment:选项卡按钮显示位置(顶部、底部、左侧、右侧)。
  3. SizeMode:调整控件的选项卡大小的样式。
  4. Multiline:是否多行显示。
  5. SelectedIndex:当前所选择的选项卡页的索引。
  6. SelectedTab:当前所选择的选项卡页,返回TabPage类型。
  1. TabPages:包含选项卡页的集合。通过按下TabPages属性后面的按钮打开【TabPage集合编辑器】来添加、删除、编辑。也可以右击选项卡控件上部分的选项看按钮,在弹出菜单中选择“添加选项卡”或“移除选项卡”进行添加默认属性的选项卡页或删除选中的选项卡页,但是没有编辑功能。

TabControl常用事件:

  1. SelectedIndexChanged:当前所选择的选项卡页索引发生改变时触发。

注意:TabControl控件有对应的事件,不同的TabPage也有各自的事件。

【例 8.53【项目:code8-053】选项卡页的增加、删除、清除和切换。

在窗体上放置四个Button控件和一个TabControl控件,并将TabControl上的选项卡页全部删除。

        //增加选项卡页

        private void button1_Click(object sender, EventArgs e)

        {

            //实例化一个选项卡页

            TabPage newTabPage = new TabPage();

            //显示名称

            newTabPage.Text = "测试";

            //放置一个标签到选项卡页上

            Label tpLabel = new Label();

            tpLabel.Text = "新建于" + DateTime.Now.ToLongTimeString();

            tpLabel.Location = new Point(20, 50);

            newTabPage.Controls.Add(tpLabel);

            //将新建的选项卡也加入到选项卡控件上

            tabControl1.TabPages.Add(newTabPage);

        }

        //删除选项卡页

        private void button2_Click(object sender, EventArgs e)

        {

            //当选中的选项卡页索引号大于-1时才执行删除

            if (tabControl1.SelectedIndex > -1)

                //使用RemoveAt(索引号)进行删除

                tabControl1.TabPages.RemoveAt(tabControl1.SelectedIndex);

        }

        //清除选项卡页

        private void button3_Click(object sender, EventArgs e)

        {

            tabControl1.TabPages.Clear();

        }

        //选项卡页按顺序切换

        private void button4_Click(object sender, EventArgs e)

        {

            //选中的选项卡页索引号

            int tabPos = tabControl1.SelectedIndex;

            //总的选项卡页数量

            int tabCount = tabControl1.TabPages.Count;

            //当下一个选项卡页索引号小于选项卡页总数时,选中下一个选项卡页

            //否则选中第一个(索引号等于0)选项卡页

            if (tabPos + 1 < tabCount)

                tabControl1.SelectedIndex = tabPos + 1;

            else if(tabPos + 1 == tabCount)

                tabControl1.SelectedIndex = 0;

        }

运行结果如下图所示:

图8-89 TabControl增加、删除选项卡页

8.4.4 SplitContainer(拆分容器)控件

SplitContainer控件是由一个可移动的拆分条及其分隔开的两个面板构成。当光标在拆分条上时,光标形状将变为水平调整大小形状或垂直调整大小形状,此时按下鼠标左键不放,可以拖动拆分条重新设置两部分面板的大小。

SplitContainer控件类似于系统资源管理器左侧的树视图、拆分条、右侧的文件夹两部分。

窗体编辑模式下,向窗体上添加一个SplitContainer,其Dock属性默认为Fill,将整个窗体分为两个面板(Panel),默认名称为Panel1和Panel2。在这两个Panel上都可以放置需要的控件,甚至在这两个面板还可以放置SplitContainer,将容器拆分为更多的面板:

图8-90 在左右拆分的基础上将右侧面板上下拆分

SplitContainer主要属性:

  1. IsSplitterFixed:指示拆分条是固定的还是可移动的。固定为True,可移动为False,默认值为False。
  2. Orientation:指示是水平方向还是垂直方向进行拆分。
  3. SplitterWidth:拆分条的宽度,默认为4像素。
  4. SplitterIncrement:拆分条移动的增量。
  5. SplitterDistance:拆分条初始时离SplitContainer的左边缘或上边缘的位置。
  6. Panel1:表示左侧面板(左右拆分时)或上部面板(上下拆分时)。在SplitContainer的【属性】窗口内,可以单击Panel1属性前面的+,展开该面板的更多属性。或者直接在窗体上直接单击Panel1,右侧【属性】窗口显示该面板的属性。
  7. Panel1Collapsed:确定 Panel1 是折叠是折叠的还是展开的。
  8. Panel1MinSize:Panel1的最小宽度或高度。
  9. Panel2:表示右侧面板(左右拆分时)或下部面板(上下拆分时)。在SplitContainer的【属性】窗口内,可以单击Panel2属性前面的+,展开该面板的更多属性。或者直接在窗体上直接单击Panel2,右侧【属性】窗口显示该面板的属性。
  10. Panel2Collapsed:确定 Panel1 是折叠是折叠的还是展开的。

注意:Panel1Collapsed和Panel2Collapsed不能同时被设置为True。

  1. Panel2MinSize:Panel2的最小宽度或高度。

注意:Panel1MinSize、Panel2MinSize和SplitterWidth之和不能超过所在SplitContainer的宽度(左右拆分时)或高度(上下拆分时)。

SplitContainer主要事件:

  1. SplitterMoving:当拖动拆分条移动时触发。由于
  2. SplitterMoved:当拖动拆分条完毕后触发。

【例 8.54【项目:code8-054】限制拆分条改变面板大小。

在窗体上放置一个SplitContainer控件,使用默认分隔为左右两个面板,Dock属性为Fill。

方法一:设置IsSplitterFixed属性为True。

方法二:设置Panel1的最小宽度、Panel2的最小宽度与拆分条宽度之和大于或等于SplitContainer的宽度。

        private void Form1_Load(object sender, EventArgs e)

        {

            splitContainer1.Panel1MinSize = 200;

            splitContainer1.Panel2MinSize = splitContainer1.Width - splitContainer1.Panel1MinSize - splitContainer1.SplitterWidth;

        }

方法三:在SplitterMoving事件中加入如下代码:

        private void splitContainer1_SplitterMoving(object sender, SplitterCancelEventArgs e)

        {

            e.Cancel = true;

        }

方法四:设置拖动拆分条位置总是等于初始时的位置。

       int sDistance;

        private void Form1_Load(object sender, EventArgs e)

        {

            sDistance = splitContainer1.SplitterDistance;

            splitContainer1.SplitterMoved += SplitContainer1_SplitterMoved;

        }

        private void SplitContainer1_SplitterMoved(object sender, SplitterEventArgs e)

        {

            splitContainer1.SplitterDistance = sDistance;

        }

注意:由于窗体载入时会触发SplitContainer1.SplitterMoved事件,请将该事件加入到窗体载入代码的最后。

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录