要想完成简单易用的用户界面,可见的UI控件当然不可少,但是制表符,弹出窗口等非界面上可见的控件也是非常重要的。今天我们就来谈谈不需要任何用户交互的控件——工具提示的应用。DevExpress Universal Suite即使在windows平台下,也支持HTML格式的工具提示。接下来我们就以XVideoRental这个DEMO为实例,讨论一下如何创建工具提示。 DataOnToolTip 如何让任意业务对象的数据属性都拥有工具提示,首先需要创建一个接口和扩展我们的应用模型列。 [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
| [size=1em][size=1em][ModelAbstractClass]
[size=1em]public interface IModelColumnTooltipData : IModelColumn {
[size=1em] IModelTooltipData TooltipData { get; }
[size=1em]}
[size=1em]public interface IModelTooltipData : IModelNode {
[size=1em] [Category("DataOnToolTip")]
[size=1em] bool DataOnToolTip { get; set; }
[size=1em] [Category("DataOnToolTip")]
[size=1em] int MaxHeight { get; set; }
[size=1em] [Category("DataOnToolTip")]
[size=1em] int MaxWidth { get; set; }
[size=1em]}
[size=1em]
[size=1em]public class GridViewImageTextToolTipController : ViewController<ListView>, IModelExtender {
[size=1em] public void ExtendModelInterfaces(ModelInterfaceExtenders extenders) {
[size=1em] extenders.Add<IModelColumn, IModelColumnTooltipData>();
[size=1em] }
|
以上代码即可完成扩展应用模型,如下图所示: 接下来设置DataOnTooltip的属性,让他能展示数据。 由于XAF的MVC架构,在任何XAF项目中重复使用该功能是非常容易的,设置都不需要任何代码便能完成。 ToolTipText 接下来,我们讨论一下,一个复杂的高级带状的ListView,要如何引导最终用户双击的行区域看到更多的记录?同样的,首先也需要扩展应用模型。 [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
| [size=1em][size=1em]public interface IModelTooltipData : IModelNode {
[size=1em] [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
[size=1em] string ToolTipText { get; set; }
[size=1em]// ...
|
接下来在模型编辑器中为文本指定ToolTipText属性,剩下的就与XAF完成了。 ToolTipController 将一个类(如Controller)关联到节点,其实在扩展应用程序模型很容易做到。在这个示例中,我们首先要为ModelToolTipData添加属性。 [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
| [size=1em][size=1em]public interface IModelTooltipData : IModelNode {
[size=1em] [DataSourceProperty("ToolTipControllers")]
[size=1em] [TypeConverter(typeof(StringToTypeConverterBase))]
[size=1em] Type ToolTipController { get; set; }
[size=1em]
[size=1em] [Browsable(false)]
[size=1em] IEnumerable<Type> ToolTipControllers { get; }
|
下面是一个不可阅览ToolTipControllers的域逻辑的示例。 [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
| [size=1em][size=1em][DomainLogic(typeof(IModelTooltipData))]
[size=1em]public class IModelToolTipControllerDomainLogic {
[size=1em] public static IEnumerable<Type> Get_ToolTipControllers(IModelToolTipController modelToolTipController) {
[size=1em] return FindTypeDescenants(typeof(ObjectToolTipController));
[size=1em] }
[size=1em] protected static IEnumerable<Type> FindTypeDescenants(Type type) {
[size=1em] var typeInfo = XafTypesInfo.Instance.FindTypeInfo(type);
[size=1em] return ReflectionHelper.FindTypeDescendants(typeInfo).Where(info => !info.IsAbstract).Select(info => info.Type);
[size=1em] }
[size=1em]
[size=1em]}
|
接下来就是为业务对象应用这个Controller了。 [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
| [size=1em][size=1em]public class MovieToolTipController : ObjectToolTipController {
[size=1em] const int MaxPhotoWidth = 120, MaxPhotoHeight = 120;
[size=1em] public MovieToolTipController(Control parent) : base(parent) { }
[size=1em]
[size=1em] protected override void InitToolTipItem(ToolTipItem item) {
[size=1em] var movie = ObjectSpace.FindObject<Movie>(CriteriaOperator.Parse("MovieTitle=?", EditObject));
[size=1em] var photo = movie.Photo;
[size=1em] if (photo != null)
[size=1em] item.Image = photo.CreateImage(MaxPhotoWidth, MaxPhotoHeight);
[size=1em] item.Text = GetMovieInfoHtml(movie);
[size=1em] }
[size=1em] public string GetMovieInfoHtml(Movie movie) {
[size=1em] return string.Format("<b>{0}</b>\r\n<i>{2:D}</i>\r\r\n{1}", movie.Title, movie.Plot, movie.ReleaseDate);
[size=1em] }
[size=1em]
[size=1em]}
|
然后将它分配给一个ListView列: 然后XAF就会弹出一个html格式的工具提示了,如下图所示: 类似的PivotGridListEditors也可以实现这个效果: 更多在线资源
|