public IDisposable CreatePMPControlFromForm(IPropertyManagerPageGroup @group, Form host, Func <IPropertyManagerPageWindowFromHandle, IDisposable> config = null)
        {
            host.Dock     = DockStyle.Fill;
            host.TopLevel = false;


            short controlType = (short)swPropertyManagerPageControlType_e.swControlType_WindowFromHandle;
            short align       = 0;
            var   options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                                (int)swAddControlOptions_e.swControlOptions_Visible;

            var dotnet3 =
                (IPropertyManagerPageWindowFromHandle)
                @group.AddControl2
                    (NextId(), controlType, "", align, options, "");

            dotnet3.SetWindowHandlex64(host.Handle.ToInt64());

            var d = config?.Invoke(dotnet3) ?? Disposable.Empty;

            //wrapper.SizeChanged += (sender, args) => host.Size = wrapper.Size;

            return(new ControlHolder(@group, dotnet3, d));
        }
        /// <summary>
        ///  泛型添加
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="group"></param>
        /// <param name="id"></param>
        /// <param name="caption"></param>
        /// <param name="tip"></param>
        /// <param name="leftAlign"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public static T AddControl <T>(this IPropertyManagerPageGroup @group,
                                       int id,
                                       string caption,
                                       string tip,
                                       swPropertyManagerPageControlLeftAlign_e leftAlign,
                                       IEnumerable <swAddControlOptions_e> options)
        {
            swPropertyManagerPageControlType_e typeE;

            switch (typeof(T).Name)
            {
            case nameof(IPropertyManagerPageTextbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Textbox;
                break;

            case nameof(IPropertyManagerPageCheckbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Checkbox;
                break;

            case nameof(IPropertyManagerPageButton):
                typeE = swPropertyManagerPageControlType_e.swControlType_Button;
                break;

            case nameof(IPropertyManagerPageSelectionbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Selectionbox;
                break;

            case nameof(IPropertyManagerPageCombobox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Combobox;
                break;

            case nameof(IPropertyManagerPageListbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Listbox;
                break;

            case nameof(IPropertyManagerPageNumberbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Numberbox;
                break;

            case nameof(IPropertyManagerPageOption):
                typeE = swPropertyManagerPageControlType_e.swControlType_Option;
                break;

            case nameof(IPropertyManagerPageLabel):
                typeE = swPropertyManagerPageControlType_e.swControlType_Label;
                break;

            case nameof(IPropertyManagerPageSlider):
                typeE = swPropertyManagerPageControlType_e.swControlType_Slider;
                break;

            case nameof(IPropertyManagerPageBitmapButton):
                typeE = swPropertyManagerPageControlType_e.swControlType_BitmapButton;
                break;

            case nameof(IPropertyManagerPageWindowFromHandle):
                throw new ArgumentException($"请使用AddWPFUserControl添加用户控件{typeof(T).Name}");

            default:
                throw new ArgumentException($"无法处理此种{typeof(T).Name}控件,请加成是否为接口");
            }
            return((T)@group
                   .AddControl2(id,
                                (short)typeE,
                                caption,
                                (short)leftAlign,
                                PropertyManagerPage2Extension.CombineOptions(options),
                                tip));
        }
        //Controls are displayed on the page top to bottom in the order
        //in which they are added to the object.
        protected void AddControls()
        {
            short controlType = -1;
            short align       = -1;
            int   options     = -1;
            bool  retval;

            //Add Message
            retval = swPropertyPage.SetMessage3("This is a sample message, marked yellow to signify importance.",
                                                (int)swPropertyManagerPageMessageVisibility.swImportantMessageBox,
                                                (int)swPropertyManagerPageMessageExpanded.swMessageBoxExpand,
                                                "Sample Important Caption");

            // Add PropertyManager Page Tabs
            ppagetab1 = swPropertyPage.AddTab(tabID1, "Page Tab 1", "", 0);
            ppagetab2 = swPropertyPage.AddTab(tabID2, "Page Tab 2", "", 0);

            //Add the groups
            options = (int)swAddGroupBoxOptions_e.swGroupBoxOptions_Expanded |
                      (int)swAddGroupBoxOptions_e.swGroupBoxOptions_Visible;

            group1 = (IPropertyManagerPageGroup)ppagetab1.AddGroupBox(group1ID, "Sample Group 1", options);

            options = (int)swAddGroupBoxOptions_e.swGroupBoxOptions_Checkbox |
                      (int)swAddGroupBoxOptions_e.swGroupBoxOptions_Visible;

            group2 = (IPropertyManagerPageGroup)ppagetab1.AddGroupBox(group2ID, "Sample Group 2", options);

            //Add the controls to group1

            //textbox1
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Textbox;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            textbox1 = (IPropertyManagerPageTextbox)group1.AddControl(textbox1ID, controlType, "Type Here", align, options, "This is an example textbox");

            //checkbox1
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Checkbox;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            checkbox1 = (IPropertyManagerPageCheckbox)group1.AddControl(checkbox1ID, controlType, "Sample Checkbox", align, options, "This is a sample checkbox");

            //option1
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Option;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            option1 = (IPropertyManagerPageOption)group1.AddControl(option1ID, controlType, "Option1", align, options, "Radio Buttons");

            //option2
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Option;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            option2 = (IPropertyManagerPageOption)group1.AddControl(option2ID, controlType, "Option2", align, options, "Radio Buttons");

            //option3
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Option;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            option3 = (IPropertyManagerPageOption)group1.AddControl(option3ID, controlType, "Option3", align, options, "Radio Buttons");

            //list1
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Listbox;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            list1 = (IPropertyManagerPageListbox)group1.AddControl(list1ID, controlType, "Sample Listbox", align, options, "List of selectable items");
            if (list1 != null)
            {
                string[] items = { "One Fish", "Two Fish", "Red Fish", "Blue Fish" };
                list1.Height = 50;
                list1.AddItems(items);
            }

            //Add controls to group2
            //selection1
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Selectionbox;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            selection1 = (IPropertyManagerPageSelectionbox)group2.AddControl(selection1ID, controlType, "Sample Selection", align, options, "Displays features selected in main view");
            if (selection1 != null)
            {
                int[] filter = { (int)swSelectType_e.swSelEDGES, (int)swSelectType_e.swSelVERTICES };
                selection1.Height = 40;
                selection1.SetSelectionFilters(filter);
            }

            //num1
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Numberbox;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            num1 = (IPropertyManagerPageNumberbox)group2.AddControl(num1ID, controlType, "Sample Numberbox", align, options, "Allows for numerical input");
            if (num1 != null)
            {
                num1.Value = 50.0;
                num1.SetRange((int)swNumberboxUnitType_e.swNumberBox_UnitlessDouble, 0.0, 100.0, 0.01, true);
            }

            //combo1
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Combobox;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            combo1 = (IPropertyManagerPageCombobox)group2.AddControl(combo1ID, controlType, "Sample Combobox", align, options, "Combo list");
            if (combo1 != null)
            {
                string[] items = { "One Fish", "Two Fish", "Red Fish", "Blue Fish" };
                combo1.AddItems(items);
                combo1.Height = 50;
            }

            // Button
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Button;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            button1 = (IPropertyManagerPageButton)group2.AddControl2(buttonID1, controlType, "Hide", align, options, "Change the visibility of the control");

            // Textbox2
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Textbox;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_Indent;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            textbox2 = (IPropertyManagerPageTextbox)group2.AddControl2(textbox2ID, controlType, "Sample Textbox", align, options, "Sample Textbox text");

            // Button
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Button;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_LeftEdge;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            button2 = (IPropertyManagerPageButton)group2.AddControl2(buttonID2, controlType, "Disable", align, options, "Disable the control");

            // Textbox3
            controlType = (int)swPropertyManagerPageControlType_e.swControlType_Textbox;
            align       = (int)swPropertyManagerPageControlLeftAlign_e.swControlAlign_Indent;
            options     = (int)swAddControlOptions_e.swControlOptions_Enabled |
                          (int)swAddControlOptions_e.swControlOptions_Visible;

            textbox3 = (IPropertyManagerPageTextbox)group2.AddControl2(textbox3ID, controlType, "Another sample Textbox", align, options, "Second Sample Textbox text");
        }
        public static T AddControl <T>(this IPropertyManagerPageGroup @group,
                                       int id,
                                       string caption,
                                       string tip,
                                       swPropertyManagerPageControlLeftAlign_e leftAlign,
                                       IEnumerable <swAddControlOptions_e> options)
        {
            swPropertyManagerPageControlType_e typeE;

            switch (typeof(T).Name)
            {
            case nameof(IPropertyManagerPageTextbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Textbox;
                break;

            case nameof(IPropertyManagerPageCheckbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Checkbox;
                break;

            case nameof(IPropertyManagerPageButton):
                typeE = swPropertyManagerPageControlType_e.swControlType_Button;
                break;

            case nameof(IPropertyManagerPageSelectionbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Selectionbox;
                break;

            case nameof(IPropertyManagerPageCombobox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Combobox;
                break;

            case nameof(IPropertyManagerPageListbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Listbox;
                break;

            case nameof(IPropertyManagerPageNumberbox):
                typeE = swPropertyManagerPageControlType_e.swControlType_Numberbox;
                break;

            case nameof(IPropertyManagerPageOption):
                typeE = swPropertyManagerPageControlType_e.swControlType_Option;
                break;

            case nameof(IPropertyManagerPageLabel):
                typeE = swPropertyManagerPageControlType_e.swControlType_Label;
                break;

            case nameof(IPropertyManagerPageSlider):
                typeE = swPropertyManagerPageControlType_e.swControlType_Slider;
                break;

            default:
                throw new ArgumentException($"Cannot handle type{typeof(T).Name}");
            }
            return((T)@group
                   .AddControl2(id,
                                (short)typeE,
                                caption,
                                (short)leftAlign,
                                CombineOptions(options),
                                tip));
        }