ToolStripSplitButton表示左侧标准按钮和右侧下拉按钮的组合,怎么才能让下拉项不是系统默认的而是可以是定制的控件,比如下拉按钮时显示的是一个ListView或者ListBox,就像vs ide中Redo,Undo List的下拉时出现效果,谢谢?
 

解决方案 »

  1.   

    自定义一个usercontrol用于host你的Listview。
    自定义一个SplitButton,设置其DropDown为你的usercontrol。
    示例代码:
     public interface IDataProvider {
                string[] GetData();
                event EventHandler DataChanged;
            }        public class StackListControl : UserControl {
                private Panel panel;
                private ListView myview;
                private IDataProvider _dataProvider;            public StackListControl(IDataProvider dataProvider) {
                    _dataProvider = dataProvider;
                    _dataProvider.DataChanged += new EventHandler(_dataProvider_DataChanged);
                }            void _dataProvider_DataChanged(object sender, EventArgs e)
                {
                    PopulateList();
                }            private void PopulateList() {
                    // get data from the provider
                    // and update the listview
                }            //...
            }        public class MySplitButton : ToolStripSplitButton {
                StackListControl _listControl;
                public MySplitButton() {
                    IDataProvider provider = CreateDataProvider();
                    _listControl = new StackListControl(provider);
                    _listControl.Dock = DockStyle.Fill;                ToolStripControlHost controlHost = new ToolStripControlHost(_listControl);
                    controlHost.Dock = DockStyle.Fill;
                    controlHost.Margin = Padding.Empty;                DropDown = new ToolStripDropDown();
                    DropDown.Items.Add(controlHost);
                    DropDownDirection = ToolStripDropDownDirection.BelowRight;
                    DropDownOpened += new EventHandler(MySplitButton_DropDownOpened);
                }            void MySplitButton_DropDownOpened(object sender, EventArgs e)
                {
                    _listControl.Focus();
                    // ...
                }            private IDataProvider CreateDataProvider() {
                    throw new NotImplementedException();
                }
            }