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获取全部成员