XAF之更丰富的状态栏

来源:互联网 发布:眼睑凹陷填充 知乎 编辑:程序博客网 时间:2024/05/17 02:41

XAF程序默认是有一个状态栏,如图1


图1  XAF默认状态栏

         但该状态栏只能显示字符串。若要自定义字符串,需要订阅WindowTemplateController. CustomizeWindowStatusMessages事件。此外,窗体仅提供了Window.Template.SetStatus(ICollection<string>)方法设置字符串,如果要在运行时更改较为麻烦。自定义状态栏字符串的方法参见帮助文档http://documentation.devexpress.com/#Xaf/CustomDocument3253

    其实,我们既然可以访问到窗体模版,就可以在代码中(当然也可以在设计器内)创建丰富的状态栏。

1.      新建一个WindowController,订阅Window.TemplateChanged事件,在为Frame设置Template时会触发该事件

protected override void OnActivated()        {            base.OnActivated();            this.Window.TemplateChanged += this.Window_TemplateChanged;        }

2.      在该WindowController内使用Window.Template访问BarManager,利用BarManager就获得了StatusBar的引用,即可以添加自己的状态栏控件了

IBarManagerHolder template = Window.Template as IBarManagerHolder;            Bar bar =  template.BarManager.StatusBar ;

下图2是一个添加了时间显示BarStaticItem和图片显示PictureEdit的状态栏:

 

图2  自定义的状态栏

private void Window_TemplateChanged(object sender, EventArgs e)        {            IBarManagerHolder template = Window.Template as IBarManagerHolder;                        if (template != null)            {                                if (this.Window.IsMain)                {                     _CurrentDateItem = new BarStaticItem();                    _CurrentDateItem.Caption = String.Format("{0} {1}", DateTime.Now.ToLongDateString(), DateTime.Now.ToLongTimeString());                    _CurrentDateItem.Alignment = BarItemLinkAlignment.Right;                    _CurrentDateItem.Name = "Current DateTime";                    _CurrentDateItem.MergeOrder = 3;                    _CurrentDateItem.MergeType = BarMenuMerge.Replace;                }                pictureItem = new BarEditItem() { CanOpenEdit = false };                RepositoryItemPictureEdit imageEdit = new RepositoryItemPictureEdit();                pictureItem.Edit = imageEdit;                imageEdit.AllowFocused = false;                imageEdit.Appearance.BackColor = System.Drawing.Color.Transparent;                imageEdit.BorderStyle = BorderStyles.NoBorder;                pictureItem.Alignment = BarItemLinkAlignment.Right;                pictureItem.EditValue = ImageLoader.Instance.GetImageInfo("arrow1").Image;                pictureItem.Name = "Company Logo";                pictureItem.MergeOrder = 4;                pictureItem.MergeType = BarMenuMerge.Replace;                Bar bar = template.BarManager != null ? template.BarManager.StatusBar : null;                if (bar != null)                {                    bar.BeginUpdate();                    if (this.Window.IsMain)                    {                        bar.ItemLinks.Add(_CurrentDateItem, true);                    }                    bar.ItemLinks.Add(pictureItem);                    bar.EndUpdate();                    this._Timer.Start();                }            }

另外,在调试过程中突然不显示自定义的项目,请删除debug目录下所有文件,再运行就行了。

Window.Template是对主窗体的引用,可以利用它获得一些很重要的对象。如

 Window.Template  as  IBarManagerHolder  -------------------获得----------------->BarManager

 Window.Template  as  IDockManagerHolder-------------------获得----------------->DockManager

 Window.Template  as  ISupportMdiContainer-------------------获得----------------->XtraTabbedMdiManager

 Window.Template  as  IWindowTemplate      -------------------获得----------------->SetStatus()方法

 Window.Template  as  IDynamicContainersTemplate  -------------------获得----------------->RegisterActionContainers, UnregisterActionContaners方法, ActionContainersChanged事件

 Window.Template  as  IViewSiteTemplate  -------------------获得----------------->ViewSiteControl

 Window.Template  as  XtraFormTeplateBase-------------------获得----------------->ActionContainersManager

或者直接使用 Window.Template  as DevExpress.ExpressApp.Win.CustomTemplates.MainForm获取全部成员