做得比较粗糙,大概意思和Visual Studio的工具箱差不多。当然,实现的方法有很多,仁者见仁智者见智了。结合了DockPanel,效果还可以。控件用到button两个:btnControls、btnLine,listview两个:listViewControl、listViewLine,imagelist两个:imageListControl、imageListLine,几个图片:ExpandedBlockStart、ExpandedBlockStart。代码如下:
- using System;
- using System.Windows.Forms;
- using WeifenLuo.WinFormsUI.Docking;
- namespace Practice
- {
- public partial class ToolBox : DockContent
- {
- public ToolBox()
- {
- InitializeComponent();
- }
- private bool listViewControlOpen = true; //listViewControl展开状态
- private bool listViewLineOpen = true; //listViewLine展开状态
- protected override void OnLoad(EventArgs e)
- {
- base.OnLoad(e);
- //设置停靠位置
- listViewControl.Dock = DockStyle.Top;
- listViewControl.SendToBack();
- btnControls.Dock = DockStyle.Top;
- btnControls.SendToBack();
- btnLine.Dock = DockStyle.Top;
- listViewLine.Dock = DockStyle.Top;
- listViewControl.Items.Add("RECTANGLE", 0);
- listViewControl.Items.Add("TRIANGLE", 1);
- listViewLine.Items.Add("LINE", 0);
- btnControls.Image = Properties.Resources.ExpandedBlockStart;
- btnLine.Image = Properties.Resources.ExpandedBlockStart;
- }
- public void btnControls_Click(object sender, EventArgs e)
- {
- if (listViewControlOpen == true)
- {
- listViewControl.Visible = false;
- listViewControlOpen = false;
- btnControls.Image = Properties.Resources.ContractedBlock;
- }
- else
- {
- listViewControl.Visible = true;
- listViewControlOpen = true;
- btnControls.Image = Properties.Resources.ExpandedBlockStart;
- }
- }
- public void btnLine_Click(object sender, EventArgs e)
- {
- if (listViewLineOpen == true)
- {
- listViewLine.Visible = false;
- listViewLineOpen = false;
- btnLine.Image = Properties.Resources.ContractedBlock;
- }
- else
- {
- listViewLine.Visible = true;
- listViewLineOpen = true;
- btnLine.Image = Properties.Resources.ExpandedBlockStart;
- }
- }
- protected override void OnClick(EventArgs e)
- {
- base.OnClick(e);
- this.Focus();
- }
- private void listViewControl_ItemDrag(object sender, ItemDragEventArgs e)
- {
- this.Focus();
- string ctrlName = listViewControl.FocusedItem.Text;
- DoDragDrop(ctrlName, DragDropEffects.Move);
- }
- private void listViewLine_ItemDrag(object sender, ItemDragEventArgs e)
- {
- this.Focus();
- string ctrlName = listViewLine.FocusedItem.Text;
- DoDragDrop(ctrlName, DragDropEffects.Move);
- }
- protected override void OnResize(EventArgs e)
- {
- base.OnResize(e);
- if (listViewControl.Items.Count != 0)
- {
- ChangeSize(listViewControl);
- ChangeSize(listViewLine);
- }
- }
- private void ChangeSize(ListView ctrl)
- {
- int rows;
- int itemsCount = ctrl.Items.Count;
- int itemWidth = ctrl.Items[0].Bounds.Width + 1;
- int itemHeight = ctrl.Items[0].Bounds.Height;
- int rowItems = ctrl.Width / itemWidth;
- if (rowItems < 1)
- rowItems = 1;
- rows = (itemsCount + rowItems - 1) / rowItems;
- ctrl.Height = (int)((itemHeight + 23) * rows);
- }
- }
- }