BM.AE中的命令工具体系

ArcEngine本身已经有了一套很完善的命令好工具体系,但我们直接使用时还是有些困难的。

1.ICommand接口中的图片的格式是我们不常见的,我们在设置时很不好设置。

2.Engine中的Command无法替换UI,Engine中的Command已经是和UI绑定到一起的了,如果我们要放到别的UI上需要做一些转换工作。

3.IComamnd里面的一些属性都是自读的,我们继承起来很不方面,而且有些属性例如标题、图标等,是可以允许在外部设置的。

新的命令工具框架如下:

这种结构我们在设置一些属性的时候会更加灵活,最主要的是我们把Engine中的Command和UI解耦了,当我们定义好Commad和Tool之后,我们定义的Command和Tool可以在不同的UI上体现。这样就可以很好的满足我们的项目需求。而且这样我们写代码时也就比较方便,例如我的主界面的后台代码如下:

View Code
  1 namespace BM.AE
  2 {
  3     public partial class MainWindow : DXWindow
  4     {
  5         private BM.AE.Engine.MapApplication _mapApplication = null;
  6         private Engine.GlobeApplication _globeApplication = null;
  7 
  8         public MainWindow()
  9         {
 10             ThemeManager.ApplicationThemeName = "Office2007Blue";
 11             InitializeComponent();
 12 
 13             Engine.CheckLicenses myCheckLicenses = new Engine.CheckLicenses();
 14             myCheckLicenses.Check();
 15 
 16             AxMapControl myAxMapControl = new AxMapControl();
 17             myAxMapControl.BeginInit();
 18             this.MapHost.Child = myAxMapControl;
 19             myAxMapControl.EndInit();
 20 
 21             AxPageLayoutControl myAxPageLayoutControl = new AxPageLayoutControl();
 22             myAxPageLayoutControl.BeginInit();
 23             this.PageLayoutHost.Child = myAxPageLayoutControl;
 24             myAxPageLayoutControl.EndInit();
 25 
 26             AxGlobeControl myAxGlobeControl = new AxGlobeControl();
 27             myAxGlobeControl.BeginInit();
 28             this.GlobeHost.Child = myAxGlobeControl;
 29             myAxGlobeControl.EndInit();
 30             myAxGlobeControl.Navigate = true;
 31 
 32             UI.AETocControl myAETocControl = new UI.AETocControl();
 33             this.Grid.Children.Add(myAETocControl);
 34 
 35             this._mapApplication = new BM.AE.Engine.MapApplication(myAxMapControl, myAxPageLayoutControl, myAETocControl);
 36             this._mapApplication.MainWindow = this;
 37             this._mapApplication.DefaultTool = new Commands.Maps.Standards.SelectTool(this._mapApplication);
 38 
 39             this._globeApplication = new Engine.GlobeApplication(myAxGlobeControl, null);
 40             this._globeApplication.MainWindow = this;
 41 
 42 
 43             RibbonPage myRibbonPage = new RibbonPage();
 44             myRibbonPage.Caption = "视图操作";
 45 
 46             RibbonPageGroup myRibbonPageGroup = new RibbonPageGroup();
 47             myRibbonPageGroup.Caption = "文件";
 48             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Standards.CreateNewDocCommand(this._mapApplication), false));
 49             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Standards.OpenMxdCommand(this._mapApplication), false));
 50             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Standards.SaveMxdCommand(this._mapApplication), false));
 51             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Standards.SaveAsMxdCommand(this._mapApplication), false));
 52             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Standards.ExportMapCommand(this._mapApplication), false));
 53             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Standards.OverViewCommand(this._mapApplication), false));
 54             myRibbonPage.Groups.Add(myRibbonPageGroup);
 55 
 56             myRibbonPageGroup = new RibbonPageGroup();
 57             myRibbonPageGroup.Caption = "地图工具";
 58             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.DataViews.MapZoomInTool(this._mapApplication)));
 59             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.DataViews.MapZoomOutTool(this._mapApplication)));
 60             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.DataViews.MapZoomInFixedCommand(this._mapApplication)));
 61             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.DataViews.MapZoomOutFixedCommand(this._mapApplication)));
 62             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.DataViews.MapPanTool(this._mapApplication)));
 63             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.DataViews.MapFullExtentCommand(this._mapApplication)));
 64             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.DataViews.MapZoomToLastExtentBackCommand(this._mapApplication)));
 65             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.DataViews.MapZoomToLastExtentForwardCommand(this._mapApplication)));
 66             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(this._mapApplication.DefaultTool));
 67             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Standards.IdentifyTool(this._mapApplication)));
 68             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.DataViews.MapRefreshViewCommand(this._mapApplication)));
 69             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Standards.SelectFeaturesTool(this._mapApplication)));
 70             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Standards.ClearSelectionCommand(this._mapApplication)));
 71             myRibbonPage.Groups.Add(myRibbonPageGroup);
 72 
 73             myRibbonPageGroup = new RibbonPageGroup();
 74             myRibbonPageGroup.Caption = "版式工具";
 75             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.PageLayoutViews.PageZoomInTool(this._mapApplication)));
 76             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.PageLayoutViews.PageZoomOutTool(this._mapApplication)));
 77             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.PageLayoutViews.PagePanTool(this._mapApplication)));
 78             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.PageLayoutViews.PageZoomInFixedCommand(this._mapApplication)));
 79             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.PageLayoutViews.PageZoomOutFixedCommand(this._mapApplication)));
 80             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.PageLayoutViews.PageZoomWholePageCommand(this._mapApplication)));
 81             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.PageLayoutViews.PageZoom100PercentCommand(this._mapApplication)));
 82             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.PageLayoutViews.PageZoomPageToLastExtentBackCommand(this._mapApplication)));
 83             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.PageLayoutViews.PageZoomPageToLastExtentForwardCommand(this._mapApplication)));
 84             
 85             myRibbonPage.Groups.Add(myRibbonPageGroup);
 86 
 87             myRibbonPageGroup = new RibbonPageGroup();
 88             myRibbonPageGroup.Caption = "三维操作";
 89             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeNavigateTool(this._globeApplication)));
 90             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeZoomInOutTool(this._globeApplication)));
 91             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobePanTool(this._globeApplication)));
 92             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobePanDragTool(this._globeApplication)));
 93             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeNorthCommand(this._globeApplication)));
 94             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeFlyTool(this._globeApplication)));
 95             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.GlobeOpenDocCommand(this._globeApplication)));
 96             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeFullExtentCommand(this._globeApplication)));
 97             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeFixedZoomInCommand(this._globeApplication)));
 98             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeFixedZoomOutCommand(this._globeApplication)));
 99             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeFullExtentCommand(this._globeApplication)));
100             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.GlobeSelectFeaturesTool(this._globeApplication)));
101             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Globes.Views.GlobeWalkTool(this._globeApplication)));
102 
103             myRibbonPage.Groups.Add(myRibbonPageGroup);
104 
105 
106             myRibbonPageGroup = new RibbonPageGroup();
107             myRibbonPageGroup.Caption = "测试";
108             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new BM.AE.Commands.TestCommand(this._mapApplication)));
109             myRibbonPage.Groups.Add(myRibbonPageGroup);
110 
111 
112            
113 
114             this.Ribbon.Pages.Add(myRibbonPage);
115 
116 
117             myRibbonPage = new RibbonPage();
118             myRibbonPage.Caption = "编辑";
119 
120             myRibbonPageGroup = new RibbonPageGroup();
121             myRibbonPageGroup.Caption = "编辑";
122             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Editors.EditorStartCommand(this._mapApplication)));
123             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Editors.EditorStopCommand(this._mapApplication)));
124             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Editors.EditorSaveCommand(this._mapApplication)));
125             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Editors.EditorEditTool(this._mapApplication)));
126             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Editors.EditorCopyCommand(this._mapApplication)));
127             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Editors.EditorPasteCommand(this._mapApplication)));
128             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Editors.EditorSketchTool(this._mapApplication)));
129             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfCombox(new Commands.Maps.Editors.EditorTargetLayerCommand(this._mapApplication)));
130             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Editors.EditorUndoCommand(this._mapApplication)));
131             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Editors.EditorRedoCommand(this._mapApplication)));
132             myRibbonPage.Groups.Add(myRibbonPageGroup);
133             this.Ribbon.Pages.Add(myRibbonPage);
134 
135 
136             myRibbonPage = new RibbonPage();
137             myRibbonPage.Caption = "地图输出";
138 
139             myRibbonPageGroup = new RibbonPageGroup();
140             myRibbonPageGroup.Caption = "元素";
141             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewMarkerTool(this._mapApplication)));
142             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewLineTool(this._mapApplication)));
143             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewCurveTool(this._mapApplication)));
144             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewFreeHandTool(this._mapApplication)));
145             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewRectangleTool(this._mapApplication)));
146             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewCircleTool(this._mapApplication)));
147             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewEllipseTool(this._mapApplication)));
148             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewPolygonTool(this._mapApplication)));
149             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewTextTool(this._mapApplication)));
150             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewSplinedTextTool(this._mapApplication)));
151             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.NewPictureCommand(this._mapApplication)));
152             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.RotateElementTool(this._mapApplication)));
153             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfBarCheckItem(new Commands.Maps.Elements.DefaultElementSymbolSetCommand(this._mapApplication)));
154             
155             myRibbonPage.Groups.Add(myRibbonPageGroup);
156 
157             myRibbonPageGroup = new RibbonPageGroup();
158             myRibbonPageGroup.Caption = "地图图饰";
159             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.MapSurrounds.AddNorthArrowCommand(this._mapApplication)));
160             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.MapSurrounds.AddScaleBarCommand(this._mapApplication)));
161             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.MapSurrounds.AddScaleTextCommand(this._mapApplication)));
162             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.MapSurrounds.AddLegendCommand(this._mapApplication)));
163             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.PageLayoutViews.PagePropertyCommand(this._mapApplication)));
164             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.MapSurrounds.MapGridsCommand(this._mapApplication)));
165             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.MapSurrounds.ReplaceLayoutCommand(this._mapApplication)));
166             myRibbonPage.Groups.Add(myRibbonPageGroup);
167 
168             myRibbonPageGroup = new RibbonPageGroup();
169             myRibbonPageGroup.Caption = "打印";
170             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Prints.PagePrintPreviewCommand(this._mapApplication),false));
171             myRibbonPageGroup.ItemLinks.Add(new CommandUI.CommandUIOfRibbonButton(new Commands.Maps.Prints.PagePrintSetupCommand(this._mapApplication)));
172             myRibbonPage.Groups.Add(myRibbonPageGroup);
173             this.Ribbon.Pages.Add(myRibbonPage);
174 
175 
176             //图层相关的右键菜单
177             BM.AE.CommandUI.TocContextMenu myTocContextMenu = new CommandUI.TocContextMenu();
178             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.NewGroupLayerCommand(this._mapApplication)));
179             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.RemoveSelectLayerCommand(this._mapApplication)));
180             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.ZoomToSelectLayerCommand(this._mapApplication)));
181             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.FeatureLayerLabelCommand(this._mapApplication)));
182             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.LayerRendererCommand(this._mapApplication)));
183             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.SaveAsLayerFileCommand(this._mapApplication)));
184             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.TableFieldManagerCommand(this._mapApplication)));
185             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.LayerPropertyCommand(this._mapApplication)));
186             myAETocControl.LayerContextMenu = myTocContextMenu;
187 
188 
189             //地图相关的右键菜单
190             myTocContextMenu = new CommandUI.TocContextMenu();
191             myTocContextMenu.AddCommandUI(new CommandUI.CommandUIOfToolStripMenuItem(new Commands.Maps.Layers.RemoveSelectLayerCommand(this._mapApplication)));
192             myAETocControl.MapContextMenu = myTocContextMenu;
193 
194             this._mapApplication.ActivePattern = Engine.MapActivePattern.Map;
195         }
196 
197 
198 
199         private void DXTabControl_SelectionChanged(object sender, TabControlSelectionChangedEventArgs e)
200         {
201             if (this._mapApplication == null)
202             {
203                 return;
204             }
205             DXTabControl myTabControl = sender as DXTabControl;
206             if (myTabControl.SelectedIndex == 0)
207             {
208                 this._mapApplication.ActivePattern = Engine.MapActivePattern.Map;
209                 this._mapApplication.CrruteTool = this._mapApplication.DefaultTool;
210             }
211             else if (myTabControl.SelectedIndex == 1)
212             {
213                 this._mapApplication.ActivePattern = Engine.MapActivePattern.PageLayout;
214                 this._mapApplication.CrruteTool = this._mapApplication.DefaultTool;
215             }
216             else
217             {
218                 this._mapApplication.ActivePattern = Engine.MapActivePattern.None;
219             }
220 
221             this._globeApplication.IsActive = (myTabControl.SelectedIndex == 2);
222 
223         }
224 
225     }
226 
227 }

两百多行代码,就生成了我们下面的主界面上的Command和Tool。

IAECommand的代码定义如下:

View Code
namespace BM.AE.Engine
{

    /// <summary>
    /// 系统命令接口
    /// </summary>
    public interface IAECommand:ESRI.ArcGIS.SystemUI.ICommand
    {
        /// <summary>
        /// 是否可见
        /// </summary>
        bool Visible { get;}

        /// <summary>
        /// 主操作对象
        /// </summary>
        IApplication Application { get; }


        /// <summary>
        /// 显示的图像
        /// </summary>
        ImageSource Image { get; }


        /// <summary>
        /// 命令和U传递数据的值对象
        /// </summary>
        ICommandValue CommandValue{ get; }

        /// <summary>
        /// 设置工具UI
        /// </summary>
        /// <param name="pCommandUI"></param>
        void SetCommandUI(ICommandUI pCommandUI);


    }
}

AECommand的代码定义如下:

View Code
namespace BM.AE.Engine
{

    /// <summary>
    /// 命令基类
    /// </summary>
    public class AECommand:IAECommand
    {
        private IApplication _application = null;
        private ICommandUI _commandUI=null;

        private string _caption = "";
        private bool _checked = false;
        private bool _enabled = true;
        private string _message="";
        private string _name = "";
        private string _tooltip = "";
        private bool _visible = true;
        private ImageSource _image = null;

        /// <summary>
        /// 命令抽象类
        /// </summary>
        /// <param name="pDCApplication"></param>
        public AECommand(IApplication pApplication)
        {
            this._application = pApplication;
            this._commandUI = new NullCommandUI();
            this.Application.OnActiveStateChanged += new EventHandler<EventArgs>(ActiveStateChanged);
        }


        /// <summary>
        /// 命令抽象类
        /// </summary>
        public AECommand()
        {
            this._commandUI = new NullCommandUI();
        }


        public int Bitmap
        {
            get { return 0; }
        }



        public string Caption
        {
            get 
            {
                return this._caption;
            }
            set 
            {
                this._caption = value; 
            }
        }


        public string Category
        {
            get 
            {
                return "";
            }
        }


        /// <summary>
        /// 是否选中
        /// </summary>
        public bool Checked
        {
            get
            {
                return this._checked;
            }
            protected set
            {
                this._checked = value;
                this._commandUI.SetCheckedState(value);
            }
        }


        /// <summary>
        /// 是否可用
        /// </summary>
        public bool Enabled
        {
            get
            {
                return this._enabled;
            }
            protected set
            {
                this._enabled = value;
                this._commandUI.SetEnabledState(value);
                if (value == false && this.Checked)
                {
                    this.Checked = false;
                }
            }
        }

        public int HelpContextID
        {
            get { return 0; }
        }

        public string HelpFile
        {
            get { return ""; }
        }

        public string Message
        {
            get { return this._message; }
            set
            {
                this._message = value;
            }
        }

        public string Name
        {
            get { return this._name; }
            protected set { this._name = value; }
        }


        public bool Visible
        {
            get { return this._visible; }
            protected set
            {
                this._visible = value;
                this._commandUI.SetVisibleState(value);
            }
        }


        public virtual void OnClick()
        {
            this.Checked = false;
        }


        public void OnCreate(object hook)
        {
        }

        public string Tooltip
        {
            get { return this._tooltip; }
            set
            {
                this._tooltip = value;
                this._commandUI.SetToolTip(value);
            }
        }


        public ImageSource Image
        {
            get { return this._image; }
            set
            {
                this._image = value;
                this._commandUI.SetImageSource(value);
            }
        }


        public IApplication Application
        {
            get { return this._application; }
        }


        /// <summary>
        /// 命令和UI传递数据的值对象
        /// </summary>
        public ICommandValue CommandValue { get; protected set; }


        /// <summary>
        /// 得到会设置按钮所包含的UI
        /// </summary>
        public void SetCommandUI(ICommandUI pCommandUI)
        {
            this._commandUI = pCommandUI;
            if (this._commandUI == null)
            {
                this._commandUI = new NullCommandUI();
            }
            this._commandUI.SetCaption(this.Caption);
            this._commandUI.SetCheckedState(this.Checked);
            this._commandUI.SetEnabledState(this.Enabled);
            this._commandUI.SetImageSource(this.Image);
            this._commandUI.SetToolTip(this.Tooltip);
            this._commandUI.SetVisibleState(this.Visible);
        }


        /// <summary>
        /// 当系统的激活模式发生变化时执行的函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void ActiveStateChanged(object sender, EventArgs e)
        {
        }



        /// <summary>
        /// 设置图标
        /// </summary>
        /// <param name="pUrl"></param>
        protected void SetImage(string pAssemblyName,string pImagePath="")
        {
            this.Image = new BitmapImage(new Uri("/" + pAssemblyName + ";component/"+ pImagePath, UriKind.RelativeOrAbsolute));
        }


        internal void SetChecked(bool pIsChecked)
        {
            this.Checked = pIsChecked;
        }

    }
}

AETool的代码定义如下:

View Code
namespace BM.AE.Engine
{

    /// <summary>
    /// 基础工具的抽象类
    /// </summary>
    public abstract class AETool : AECommand,ITool
    {

        /// <summary>
        /// 工具基类
        /// </summary>
        /// <param name="pApplication"></param>
        public AETool(IApplication pApplication)
            : base(pApplication)
        { }


        public virtual int Cursor { get; set; }


        public virtual bool Deactivate()
        {
            return true;
        }

        public bool OnContextMenu(int x, int y)
        {
            return false;
        }

        public override void OnClick()
        {
            this.Application.CrruteTool = this;
        }

        public virtual void OnDblClick() { }

        public virtual void OnKeyDown(int keyCode, int shift) { }

        public virtual void OnKeyUp(int keyCode, int shift) { }

        public virtual void OnMouseDown(int button, int shift, int x, int y) 
        {
        }

        public virtual void OnMouseMove(int button, int shift, int x, int y) { }

        public virtual void OnMouseUp(int button, int shift, int x, int y) { }

        public virtual void Refresh(int hdc) { }

    }
}

ICommandUI的定义如下:

View Code
namespace BM.AE.Engine
{

    /// <summary>
    /// 命令可以绑定的UI接口
    /// </summary>
    public interface ICommandUI
    {

        /// <summary>
        /// 设置标题
        /// </summary>
        /// <param name="pCaption"></param>
        void SetCaption(string pCaption);


        /// <summary>
        /// 设置工具提示信息
        /// </summary>
        /// <param name="pToolTip"></param>
        void SetToolTip(string pToolTip);


        /// <summary>
        /// 设置图标
        /// </summary>
        /// <param name="pImageSource"></param>
        void SetImageSource(ImageSource pImageSource);


        /// <summary>
        /// 设置是否被选中
        /// </summary>
        /// <param name="pIsCheced"></param>
        void SetCheckedState(bool pIsCheced);


        /// <summary>
        /// 设置是否可用
        /// </summary>
        /// <param name="pIsEnabled"></param>
        void SetEnabledState(bool pIsEnabled);


        /// <summary>
        /// 设置是否可见
        /// </summary>
        /// <param name="IsVisible"></param>
        void SetVisibleState(bool pIsVisible);


        /// <summary>
        /// 得到命令对象
        /// </summary>
        /// <returns></returns>
        IAECommand GetCommand();

    }
}
原文地址:https://www.cnblogs.com/xzbluemap/p/2817094.html