Пример #1
0
        /// <summary>
        /// 更新一个主工具栏项目
        /// </summary>
        /// <param name="formEntity"></param>
        public void Update(ToolStripItemAbstract entity)
        {
            Debug.Assert(entity != null, "ToolStripItemAbstract 为 null");

            if (entity == null)
            {
                return;
            }

            //更新索引信息
            XElement element = _indexXml.XPathSelectElement(String.Format(XPATH_Index_SelectToolStrip, entity.Id));

            Debug.Assert(element != null, "更新主工具栏项目索引时未找到指定主菜单的索引记录");
            if (element != null)
            {
                element.ReplaceWith(GetArchiveIndex(entity));
                SaveIndexFile();

                string   xml      = entity.ToXml();
                XElement xElement = XElement.Parse(xml);

                //更新实体文件
                _packageService.Current.AddFileContent(xml,
                                                       Path.Combine(Constant.PACKAGE_NAVIGATION_TOOLSTRIP_FOLDER, entity.Id));

                _cachingService.Add(entity.Id, xElement);

                //发布事件
                ToolStripEventArgs args = new ToolStripEventArgs(entity);
                _eventAggregator.GetEvent <ToolStripItemUpdatedEvent>().Publish(args);
            }
        }
Пример #2
0
        /// <summary>
        /// 删除菜单项,及其所有子项
        /// </summary>
        /// <param name="code"></param>
        public void Delete(ToolStripItemAbstract entity)
        {
            Debug.Assert(entity != null, "entity 为 null");

            if (entity == null)
            {
                return;
            }

            //移除索引信息
            XElement element = _indexXml.XPathSelectElement(String.Format(XPATH_Index_SelectToolStrip, entity.Id));

            Debug.Assert(element != null, "删除主工具栏索引时未找到指定主菜单的索引记录");
            if (element != null)
            {
                element.Remove();
                SaveIndexFile();

                //移除实体文件
                _packageService.Current.DeleteFile(Path.Combine(Constant.PACKAGE_NAVIGATION_TOOLSTRIP_FOLDER, entity.Id));

                _cachingService.Remove(entity.Id);

                //发布事件
                ToolStripEventArgs args = new ToolStripEventArgs(entity);
                _eventAggregator.GetEvent <ToolStripItemRemovedEvent>().Publish(args);
            }
        }
 public SEToolStripButtonDev(ToolStripItemAbstract item)
 {
     ToolStripButtonEntity entity = (ToolStripButtonEntity)item;
     this.Text = entity.Text;
     this.DisplayStyle = (ToolStripItemDisplayStyle)Enum.Parse(typeof(ToolStripItemDisplayStyle), ((int)entity.DisplayStyle).ToString());
     this.TextImageRelation = (TextImageRelation)Enum.Parse(typeof(TextImageRelation), ((int)entity.TextImageRelation).ToString()); 
     this.Alignment = (ToolStripItemAlignment)Enum.Parse(typeof(ToolStripItemAlignment), ((int)entity.Aligment).ToString());
     this.ToolTipText = entity.ToolTipText;
     if (entity.Image != null && entity.Image != String.Empty)
     {
         FileInfo fi = new FileInfo(entity.Image);
         Image image;
         if (fi.Exists)
         {
             image = DrawingTool.GetImage(fi.FullName);
         }
         else
         {
             image = new Bitmap(16, 16);
             using (Graphics g = Graphics.FromImage(image))
             {
                 g.DrawRectangle(Pens.Red, 0, 0, image.Width - 1, image.Height - 1);
                 g.DrawLine(Pens.Red, 0, 0, image.Width, image.Height);
                 g.DrawLine(Pens.Red, image.Width, 0, 0, image.Height);
             }
         }
         this.Image = image;
     }
 }
Пример #4
0
        /// <summary>
        /// 添加一个菜单项
        /// </summary>
        /// <param name="entity"></param>
        public void Add(ToolStripItemAbstract entity)
        {
            Debug.Assert(entity != null, "entity 为 null");

            if (entity == null)
            {
                return;
            }

            //添加索引信息
            _indexXml.XPathSelectElement(XPATH_Index_ToolStrip).Add(GetArchiveIndex(entity));

            string   xml      = entity.ToXml();
            XElement xElement = XElement.Parse(xml);

            SaveIndexFile();

            //添加数据实体文件
            _packageService.Current.AddFileContent(xml,
                                                   Path.Combine(Constant.PACKAGE_NAVIGATION_TOOLSTRIP_FOLDER, entity.Id));

            _cachingService.Add(entity.Id, xElement);

            //发布事件
            ToolStripEventArgs args = new ToolStripEventArgs(entity);

            _eventAggregator.GetEvent <ToolStripItemAddedEvent>().Publish(args);
        }
        public SEToolStripLabelDev(ToolStripItemAbstract item)
        {
            ToolStripLabelEntity entity = (ToolStripLabelEntity)item;

            this.Text        = entity.Text;
            this.Alignment   = (ToolStripItemAlignment)Enum.Parse(typeof(ToolStripItemAlignment), ((int)entity.Aligment).ToString());
            this.ToolTipText = entity.ToolTipText;
        }
Пример #6
0
        private void CreateToolStripItem()
        {
            ToolStripItemEntityProvideAttribute attribute = this.ddlControlType.SelectedValue as ToolStripItemEntityProvideAttribute;

            if (attribute != null)
            {
                this.ToolStripElement = _toolStripItemEntityTypesFactory.CreateInstance(attribute);
            }
        }
Пример #7
0
        void IArchiveService.Delete(object obj)
        {
            ToolStripItemAbstract entity = obj as ToolStripItemAbstract;

            Debug.Assert(entity != null, "entity为null");
            if (entity != null)
            {
                Delete(entity);
            }
        }
        public static ToolStripItemAbstract GetToolStripItemDevByXml(string strXml)
        {
            ToolStripItemAbstract toolStripItem = null;
            XmlDocument           xmlDoc        = new XmlDocument();

            xmlDoc.LoadXml(strXml);
            toolStripItem =
                (ToolStripItemAbstract)FormElementEntityDevTypes.Instance.CreateInstance(Convert.ToInt32(xmlDoc.SelectSingleNode("Element/ControlType").InnerText));
            toolStripItem.FromXml(strXml);
            return(toolStripItem);
        }
Пример #9
0
        /// <summary>
        /// 获取用于存储在XML索引文件中的索引节点
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        private XElement GetArchiveIndex(ToolStripItemAbstract entity)
        {
            Debug.Assert(entity != null, "entity 为 null");

            XElement ele = new XElement("Entity",
                                        new XAttribute("Id", entity.Id),
                                        new XAttribute("Name", entity.Name),
                                        new XAttribute("Code", entity.Code),
                                        new XAttribute("GroupId", entity.GroupId),
                                        new XAttribute("Sys", entity.Sys));

            //new XAttribute("ParentId", entity.ParentId));
            //计划将来工具栏项目支持多级

            return(ele);
        }
Пример #10
0
        /// <summary>
        /// 获取工具栏所有项
        /// </summary>
        /// <param name="parentId"></param>
        /// <returns></returns>
        public ToolStripItemEntityCollection GetEntityList()
        {
            XElement[] entityElements = _indexXml.XPathSelectElements(XPATH_Index_ToolStrip_Entity).ToArray();

            ToolStripItemEntityCollection list = new ToolStripItemEntityCollection();

            foreach (XElement element in entityElements)
            {
                ToolStripItemAbstract entity = GetEntity(element.Attribute("Id").Value);
                if (entity != null)
                {
                    list.Add(entity);
                }
            }

            return(list);
        }
Пример #11
0
        /// <summary>
        /// 提交
        /// 根据MenuEntity的Id进行判断,如果已存在,调用update,如果不存在,调用add
        /// </summary>
        /// <param name="dataEntity"></param>
        public void Commit(ToolStripItemAbstract entity)
        {
            Debug.Assert(entity != null, "enumEntity 为 null");

            if (entity == null)
            {
                return;
            }

            if (EntityExistById(entity.Id))
            {
                Update(entity);
            }
            else
            {
                Add(entity);
            }
        }
Пример #12
0
        /// <summary>
        /// 获取一个工具栏项实例(根据Id)
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ToolStripItemAbstract GetEntity(string id)
        {
            XElement entityElement = (XElement)_cachingService.GetData(id);
            string   strEntity;

            if (entityElement == null)
            {
                string file      = Path.Combine(Constant.PACKAGE_NAVIGATION_TOOLSTRIP_FOLDER, id);
                bool   fileExist = _packageService.Current.Container(file);

                Debug.Assert(fileExist, "工具栏项文件不存在");
                if (fileExist == false)
                {
                    return(null);
                }

                strEntity     = _packageService.Current.GetFileContent(file);
                entityElement = XElement.Parse(strEntity);
                _cachingService.Add(id, entityElement);
            }
            else
            {
                strEntity = entityElement.ToString();
            }

            int controlType = Convert.ToInt32(entityElement.Element("ControlType").Value);

            ToolStripItemAbstract entity = _toolStripItemEntityTypesFactory.CreateInstance(controlType);

            if (entity == null)
            {
                Debug.Assert(false, "_toolStripItemsContainer.Create(controlType) 失败,返回了null");
                throw new Exception();
            }
            entity.FromXml(strEntity);

            return(entity);
        }
Пример #13
0
 public ToolStripEventArgs(ToolStripItemAbstract entity)
 {
     this.Entity = entity;
 }
Пример #14
0
        private void SubscribeEvent()
        {
            //订阅数据实体的增删改事件,以更新呈现

            #region Page

            #region ToolStripPageAddedEvent

            SubscriptionToken toolStripPageAddedEventToken =
                _eventAggregator.GetEvent <ToolStripPageAddedEvent>().Subscribe((e) =>
            {
                _controller.Add(e.Entity,
                                (node) =>
                {
                    if (node.Codon.DataBoundType == typeof(ToolStripItemFolder))
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                });
            });

            #endregion

            #region ToolStripPageUpdatedEvent

            SubscriptionToken toolStripPageUpdatedEventToken =
                _eventAggregator.GetEvent <ToolStripPageUpdatedEvent>().Subscribe((e) => { _controller.Update(e.Entity); });

            #endregion

            #region ToolStripPageRemovedEvent

            SubscriptionToken toolStripPageRemovedEventToken =
                _eventAggregator.GetEvent <ToolStripPageRemovedEvent>().Subscribe((e) => { _controller.Remove(e.Entity); });

            #endregion

            #region ToolStripPageMoveBeforeEvent

            SubscriptionToken toolStripPageMoveBeforeEventToken =
                _eventAggregator.GetEvent <ToolStripPageMoveBeforeEvent>().Subscribe((e) =>
            {
                _controller.MoveBefore(
                    (source) =>
                {
                    if (source.Codon.DataBoundType == typeof(ToolStripPageEntity))
                    {
                        ToolStripPageEntity toolStripPageEntity = (ToolStripPageEntity)source.DataBoundItem;
                        return(toolStripPageEntity.Id == e.Id);
                    }
                    else
                    {
                        return(false);
                    }
                },
                    (target) =>
                {
                    if (target.Codon.DataBoundType == typeof(ToolStripPageEntity))
                    {
                        ToolStripPageEntity toolStripPageEntity = (ToolStripPageEntity)target.DataBoundItem;
                        return(toolStripPageEntity.Id == e.BeforeId);
                    }
                    else
                    {
                        return(false);
                    }
                }
                    );
            });

            #endregion

            #region ToolStripPageMoveAfterEvent

            SubscriptionToken toolStripPageMoveAfterEventToken =
                _eventAggregator.GetEvent <ToolStripPageMoveAfterEvent>().Subscribe((e) =>
            {
                _controller.MoveAfter(
                    (source) =>
                {
                    if (source.Codon.DataBoundType == typeof(ToolStripPageEntity))
                    {
                        ToolStripPageEntity toolStripPageEntity = (ToolStripPageEntity)source.DataBoundItem;
                        return(toolStripPageEntity.Id == e.Id);
                    }
                    else
                    {
                        return(false);
                    }
                },
                    (target) =>
                {
                    if (target.Codon.DataBoundType == typeof(ToolStripPageEntity))
                    {
                        ToolStripPageEntity toolStripPageEntity = (ToolStripPageEntity)target.DataBoundItem;
                        return(toolStripPageEntity.Id == e.AfterId);
                    }
                    else
                    {
                        return(false);
                    }
                }
                    );
            });

            #endregion

            #endregion

            #region Group

            #region ToolStripGroupAddedEvent

            SubscriptionToken toolStripGroupAddedEventToken =
                _eventAggregator.GetEvent <ToolStripGroupAddedEvent>().Subscribe((e) =>
            {
                _controller.Add(e.Entity,
                                (node) =>
                {
                    if (node.Codon.DataBoundType == typeof(ToolStripPageEntity))
                    {
                        ToolStripPageEntity entity = (ToolStripPageEntity)node.DataBoundItem;
                        return(e.Entity.PageId == entity.Id);
                    }
                    else
                    {
                        return(false);
                    }
                });
            });

            #endregion

            #region ToolStripGroupUpdatedEvent

            SubscriptionToken toolStripGroupUpdatedEventToken =
                _eventAggregator.GetEvent <ToolStripGroupUpdatedEvent>().Subscribe((e) => { _controller.Update(e.Entity); });

            #endregion

            #region ToolStripGroupRemovedEvent

            SubscriptionToken toolStripGroupRemovedEventToken =
                _eventAggregator.GetEvent <ToolStripGroupRemovedEvent>().Subscribe((e) => { _controller.Remove(e.Entity); });

            #endregion

            #region ToolStripGroupMoveBeforeEvent

            SubscriptionToken toolStripGroupMoveBeforeEventToken =
                _eventAggregator.GetEvent <ToolStripGroupMoveBeforeEvent>().Subscribe((e) =>
            {
                _controller.MoveBefore(
                    (source) =>
                {
                    if (source.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                    {
                        ToolStripGroupEntity toolStripGroupEntity = (ToolStripGroupEntity)source.DataBoundItem;
                        return(toolStripGroupEntity.Id == e.Id);
                    }
                    else
                    {
                        return(false);
                    }
                },
                    (target) =>
                {
                    if (target.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                    {
                        ToolStripGroupEntity toolStripGroupEntity = (ToolStripGroupEntity)target.DataBoundItem;
                        return(toolStripGroupEntity.Id == e.BeforeId);
                    }
                    else
                    {
                        return(false);
                    }
                }
                    );
            });

            #endregion

            #region ToolStripGroupMoveAfterEvent

            SubscriptionToken toolStripGroupMoveAfterEventToken =
                _eventAggregator.GetEvent <ToolStripGroupMoveAfterEvent>().Subscribe((e) =>
            {
                _controller.MoveAfter(
                    (source) =>
                {
                    if (source.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                    {
                        ToolStripGroupEntity toolStripGroupEntity = (ToolStripGroupEntity)source.DataBoundItem;
                        return(toolStripGroupEntity.Id == e.Id);
                    }
                    else
                    {
                        return(false);
                    }
                },
                    (target) =>
                {
                    if (target.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                    {
                        ToolStripGroupEntity toolStripGroupEntity = (ToolStripGroupEntity)target.DataBoundItem;
                        return(toolStripGroupEntity.Id == e.AfterId);
                    }
                    else
                    {
                        return(false);
                    }
                }
                    );
            });

            #endregion

            #endregion

            #region Items

            #region ToolStripItemAddedEvent

            SubscriptionToken toolStripItemAddedEventToken =
                _eventAggregator.GetEvent <ToolStripItemAddedEvent>().Subscribe((e) =>
            {
                _controller.Add(e.Entity,
                                (node) =>
                {
                    if (node.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                    {
                        ToolStripGroupEntity entity = (ToolStripGroupEntity)node.DataBoundItem;
                        return(e.Entity.GroupId == entity.Id);
                    }
                    else
                    {
                        return(false);
                    }
                });
            });

            #endregion

            #region ToolStripItemRemovedEvent

            SubscriptionToken toolStripItemRemovedEventToken =
                _eventAggregator.GetEvent <ToolStripItemRemovedEvent>().Subscribe((e) => { _controller.Remove(e.Entity); });

            #endregion

            #region ToolStripItemUpdatedEvent

            SubscriptionToken toolStripItemUpdatedEventToken =
                _eventAggregator.GetEvent <ToolStripItemUpdatedEvent>().Subscribe((e) => { _controller.Update(e.Entity); });

            #endregion

            #region ToolStripItemMoveBeforeEvent

            SubscriptionToken toolStripItemMoveBeforeEventToken =
                _eventAggregator.GetEvent <ToolStripItemMoveBeforeEvent>().Subscribe((e) =>
            {
                _controller.MoveBefore(
                    (source) =>
                {
                    if (source.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                    {
                        ToolStripItemAbstract toolStripEntity = (ToolStripItemAbstract)source.DataBoundItem;
                        return(toolStripEntity.Id == e.Id);
                    }
                    else
                    {
                        return(false);
                    }
                },
                    (target) =>
                {
                    if (target.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                    {
                        ToolStripItemAbstract toolStripEntity = (ToolStripItemAbstract)target.DataBoundItem;
                        return(toolStripEntity.Id == e.BeforeId);
                    }
                    else
                    {
                        return(false);
                    }
                }
                    );
                //_navigationTreeController.Select((node) =>
                //{
                //    if (node.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                //    {
                //        ToolStripItemAbstract menuEntity = (ToolStripItemAbstract)node.DataBoundItem;
                //        return menuEntity.Id == e.Id;
                //    }
                //    else
                //        return false;
                //});
            });

            #endregion

            #region ToolStripItemMoveAfterEvent

            SubscriptionToken toolStripItemMoveAfterEventToken =
                _eventAggregator.GetEvent <ToolStripItemMoveAfterEvent>().Subscribe((e) =>
            {
                _controller.MoveAfter(
                    (source) =>
                {
                    if (source.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                    {
                        ToolStripItemAbstract toolStripEntity = (ToolStripItemAbstract)source.DataBoundItem;
                        return(toolStripEntity.Id == e.Id);
                    }
                    else
                    {
                        return(false);
                    }
                },
                    (target) =>
                {
                    if (target.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                    {
                        ToolStripItemAbstract toolStripEntity = (ToolStripItemAbstract)target.DataBoundItem;
                        return(toolStripEntity.Id == e.AfterId);
                    }
                    else
                    {
                        return(false);
                    }
                }
                    );
                //_navigationTreeController.Select((node) =>
                //{
                //    if (node.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                //    {
                //        ToolStripItemAbstract menuEntity = (ToolStripItemAbstract)node.DataBoundItem;
                //        return menuEntity.Id == e.Id;
                //    }
                //    else
                //        return false;
                //});
            });

            #endregion

            #endregion

            #region * Unsubscribe *

            this.Disposed += (sender, e) =>
            {
                _eventAggregator.GetEvent <ToolStripPageAddedEvent>().Unsubscribe(toolStripPageAddedEventToken);
                _eventAggregator.GetEvent <ToolStripPageUpdatedEvent>().Unsubscribe(toolStripPageUpdatedEventToken);
                _eventAggregator.GetEvent <ToolStripPageRemovedEvent>().Unsubscribe(toolStripPageRemovedEventToken);
                _eventAggregator.GetEvent <ToolStripPageMoveBeforeEvent>().Unsubscribe(toolStripPageMoveBeforeEventToken);
                _eventAggregator.GetEvent <ToolStripPageMoveAfterEvent>().Unsubscribe(toolStripPageMoveAfterEventToken);

                _eventAggregator.GetEvent <ToolStripGroupAddedEvent>().Unsubscribe(toolStripGroupAddedEventToken);
                _eventAggregator.GetEvent <ToolStripGroupUpdatedEvent>().Unsubscribe(toolStripGroupUpdatedEventToken);
                _eventAggregator.GetEvent <ToolStripGroupRemovedEvent>().Unsubscribe(toolStripGroupRemovedEventToken);
                _eventAggregator.GetEvent <ToolStripGroupMoveBeforeEvent>().Unsubscribe(toolStripGroupMoveBeforeEventToken);
                _eventAggregator.GetEvent <ToolStripGroupMoveAfterEvent>().Unsubscribe(toolStripGroupMoveAfterEventToken);

                _eventAggregator.GetEvent <ToolStripItemAddedEvent>().Unsubscribe(toolStripItemAddedEventToken);
                _eventAggregator.GetEvent <ToolStripItemRemovedEvent>().Unsubscribe(toolStripItemRemovedEventToken);
                _eventAggregator.GetEvent <ToolStripItemUpdatedEvent>().Unsubscribe(toolStripItemUpdatedEventToken);
                _eventAggregator.GetEvent <ToolStripItemMoveBeforeEvent>().Unsubscribe(toolStripItemMoveBeforeEventToken);
                _eventAggregator.GetEvent <ToolStripItemMoveAfterEvent>().Unsubscribe(toolStripItemMoveAfterEventToken);
            };

            #endregion
        }
Пример #15
0
        private void InitController()
        {
            _controller = new TypeBinderTreeViewController(this.treeView);

            #region ImageList

            //节点的小图标ImageList
            ImageList _imageList = new ImageList();
            _imageList.Images.Add(IconsLibrary.Folder);        //0
            _imageList.Images.Add(IconsLibrary.ActiveTabItem); //1
            _imageList.Images.Add(IconsLibrary.GroupItem);     //2
            _imageList.Images.Add(IconsLibrary.Menu);          //3
            _controller.ImageList = _imageList;

            #endregion

            #region Codon

            _controller.AddNodeCodon(new TypeBinderTreeViewNodeCodon(
                                         typeof(ToolStripItemFolder), typeof(ToolStripPageEntity),
                                         ToolStripItemFolder.Property_Text, ToolStripItemFolder.Property_Items)
            {
                ImageIndex       = TreeImages.Folder,
                ContextMenuStrip = _treeMenuToolStripItemFolder.View
            });

            TypeBinderTreeViewNodeCodon pageCodon = new TypeBinderTreeViewNodeCodon(
                typeof(ToolStripPageEntity), typeof(ToolStripGroupEntity),
                ToolStripItemAbstract.Property_Name)
            {
                ImageIndex          = TreeImages.ToolStripPageEntity,
                ActOnSubClass       = true,
                ContextMenuStrip    = _treeMenuToolStripPage.View,
                RelationChildMember = ToolStripPageEntity.Property_Id
            };
            pageCodon.GetItemsFunc = (pageEntity) =>
            {
                return(ToolStripArchive.Instance.GetGroupCollection(((ToolStripPageEntity)pageEntity).Id));
            };
            _controller.AddNodeCodon(pageCodon);

            TypeBinderTreeViewNodeCodon groupCodon = new TypeBinderTreeViewNodeCodon(
                typeof(ToolStripGroupEntity), typeof(ToolStripItemAbstract),
                ToolStripItemAbstract.Property_Name)
            {
                ImageIndex           = TreeImages.ToolStripGroupEntity,
                ActOnSubClass        = true,
                ContextMenuStrip     = _treeMenuToolStripGroup.View,
                RelationParentMember = ToolStripGroupEntity.Property_PageId,
                RelationChildMember  = ToolStripGroupEntity.Property_Id
            };
            groupCodon.GetItemsFunc = (groupEntity) =>
            {
                return(ToolStripArchive.Instance.GetEntityList(((ToolStripGroupEntity)groupEntity).Id));
            };
            _controller.AddNodeCodon(groupCodon);

            _controller.AddNodeCodon(new TypeBinderTreeViewNodeCodon(
                                         typeof(ToolStripItemAbstract), ToolStripItemAbstract.Property_Name)
            {
                ActOnSubClass        = true,//因为实际运行是Dev结尾的类型
                ImageIndex           = TreeImages.ToolStripItemAbstract,
                ContextMenuStrip     = _treeMenuToolStripItem.View,
                RelationParentMember = ToolStripItemAbstract.Property_GroupId
            });

            #endregion

            _controller.AfterSelect += new TypeBinderTreeViewController.OnAfterSelectHandler(_controller_AfterSelect);

            #region 处理拖放

            treeView.AllowDrop = true;

            #region CanDragFunc

            treeView.CanDragFunc = (dragNode) =>
            {
                //总文件夹不允许拖动
                ITypeBinderTreeViewNode binderDragNode = (ITypeBinderTreeViewNode)dragNode;
                if (binderDragNode.Codon.DataBoundType == typeof(ToolStripItemFolder))
                {
                    return(false);
                }
                else
                {
                    return(true);
                }
            };

            #endregion

            #region CanDropFunc

            treeView.CanDropFunc = (dragNode, dropNode) =>
            {
                ITypeBinderTreeViewNode binderDragNode = (ITypeBinderTreeViewNode)dragNode;
                ITypeBinderTreeViewNode binderDropNode = (ITypeBinderTreeViewNode)dropNode;

                //如果拖的是页,那只允许放在页上
                if (binderDragNode.Codon.DataBoundType == typeof(ToolStripPageEntity))
                {
                    if (binderDropNode.Codon.DataBoundType == typeof(ToolStripPageEntity))
                    {
                        return(true);
                    }
                }

                //如果拖的是分组,允许放在页和分组上
                if (binderDragNode.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                {
                    if (binderDropNode.Codon.DataBoundType == typeof(ToolStripPageEntity) ||
                        binderDropNode.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                    {
                        return(true);
                    }
                }

                //如果拖的是项,允许放在分组和项上
                if (binderDragNode.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                {
                    if (binderDropNode.Codon.DataBoundType == typeof(ToolStripGroupEntity) ||
                        binderDropNode.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                    {
                        return(true);
                    }
                }

                return(false);
            };

            #endregion

            #region DragDropAction

            treeView.DragDropAction = (dragNode, dropNode) =>
            {
                ITypeBinderTreeViewNode binderDragNode = (ITypeBinderTreeViewNode)dragNode;
                ITypeBinderTreeViewNode binderDropNode = (ITypeBinderTreeViewNode)dropNode;

                #region 如果拖的是页

                //如果拖的是页,那只允许放在页上
                //移动拖动的页到放置的页后面
                if (binderDragNode.Codon.DataBoundType == typeof(ToolStripPageEntity))
                {
                    if (binderDropNode.Codon.DataBoundType == typeof(ToolStripPageEntity))
                    {
                        //只要调用 _toolStripArchive.MovePageAfter 就行了
                        //树节点的移动会由相关事件引发
                        ToolStripPageEntity dragPage = (ToolStripPageEntity)binderDragNode.DataBoundItem;
                        ToolStripPageEntity dropPage = (ToolStripPageEntity)binderDropNode.DataBoundItem;
                        _toolStripArchive.MovePageAfter(dragPage.Id, dropPage.Id);
                    }
                }

                #endregion

                #region 如果拖的是分组

                //如果拖的是分组,允许放在页和分组上
                if (binderDragNode.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                {
                    ToolStripGroupEntity dragGroup = (ToolStripGroupEntity)binderDragNode.DataBoundItem;

                    //放在放置页的最后面
                    if (binderDropNode.Codon.DataBoundType == typeof(ToolStripPageEntity))
                    {
                        ToolStripPageEntity dropPage = (ToolStripPageEntity)binderDropNode.DataBoundItem;
                        dragGroup.PageId = dropPage.Id;

                        //确保拖的分组在放的页的最后一项
                        if (binderDropNode.Items.Count > 0)
                        {
                            ToolStripGroupEntity lastGroup = (ToolStripGroupEntity)binderDropNode.Items[binderDropNode.Items.Count - 1];
                            _toolStripArchive.MoveGroupAfter(dragGroup.Id, lastGroup.Id);
                        }

                        _toolStripArchive.UpdateGroup(dragGroup);
                    }
                    //放在放置分组的后面,同时注意修改拖动分组所属页到放置分组所属的页上
                    else if (binderDropNode.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                    {
                        ToolStripGroupEntity dropGroup = (ToolStripGroupEntity)binderDropNode.DataBoundItem;
                        _toolStripArchive.MoveGroupAfter(dragGroup.Id, dropGroup.Id);

                        if (dragGroup.PageId != dropGroup.PageId)
                        {
                            dragGroup.PageId = dropGroup.PageId;
                            _toolStripArchive.UpdateGroup(dragGroup);
                        }
                    }
                }

                #endregion

                #region 如果拖的是项

                //如果拖的是项,允许放在分组和项上
                if (binderDragNode.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                {
                    ToolStripItemAbstract dragItem = (ToolStripItemAbstract)binderDragNode.DataBoundItem;

                    //放在放置分组的最后面,同时修改拖动项所属分组
                    //放置分组肯定不是项原来的分组,因为如果把树子节点拖到自己的父节点上什么也不会发生,SETreeView里不允许这种操作
                    if (binderDropNode.Codon.DataBoundType == typeof(ToolStripGroupEntity))
                    {
                        ToolStripGroupEntity dropGroup = (ToolStripGroupEntity)binderDropNode.DataBoundItem;
                        dragItem.GroupId = dropGroup.Id;

                        //确保拖的分组在放的页的最后一项
                        if (binderDropNode.Items.Count > 0)
                        {
                            ToolStripItemAbstract lastItem = (ToolStripItemAbstract)binderDropNode.Items[binderDropNode.Items.Count - 1];
                            _toolStripArchive.MoveAfter(dragItem.Id, lastItem.Id);
                        }

                        _toolStripArchive.Update(dragItem);
                    }
                    //放在放置项的后面,同时修改拖动项所属分组为放置项所属的分组,如果他们不在一个分组
                    if (binderDropNode.Codon.DataBoundType == typeof(ToolStripItemAbstract))
                    {
                        ToolStripItemAbstract dropItem = (ToolStripItemAbstract)binderDropNode.DataBoundItem;
                        _toolStripArchive.MoveAfter(dragItem.Id, dropItem.Id);

                        if (dragItem.GroupId != dropItem.GroupId)
                        {
                            dragItem.GroupId = dropItem.GroupId;
                            _toolStripArchive.Update(dragItem);
                        }
                    }
                }

                #endregion
            };

            #endregion

            #endregion
        }