测试环境Revit2016;
引用Revit的DLL有RevitAPI.dll,RevitAPIUI.dll,AdWindows.dll,UIFramework.dll.
如何实现像Revit自带的命令一样,当鼠标长停在button上,出现动画或者图片(如图1)。
查看RevitAPIUI.dll中的 Autodesk.Revit.UI.PushButtonData,发现revit提供了ToolTipImage属性,但是它只能添加图片,无法添加动画,所以我们要使用AdWindows.dll提供的Autodesk.Windows.RibbonItem,来给ToolTip属性赋值。
这个方法的关键是找到Autodesk.Windows命名空间下的RibbonItem,本文将提供两种方式,一种是遍历Autodesk.Windows.RibbonControl,第二种是通过Autodesk.Revit.UI.RibbonItem反射查找Autodesk.Windows.RibbonItem。
使用C:/Program Files/Autodesk/Revit 2016/videos/目录下的视频文件(根据Revit安装目录查找文件),最后实现效果如图2。

图1 图2
using Autodesk.Revit.UI;
using Autodesk.Windows;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using UIFramework;
using RibbonItem = Autodesk.Revit.UI.RibbonItem;
namespace ButtonVideo
{
public class App : IExternalApplication
{
private const string tabName = "VButton";
private const string panelName = "Video tooltip";
public Result OnShutdown(UIControlledApplication application)
{
return Result.Succeeded;
}
public Result OnStartup(UIControlledApplication application)
{
RibbonControl ribbonControl = RevitRibbonControl.RibbonControl;
var ribbonTab = ribbonControl.FindTab(tabName);
if (ribbonTab == null)
{
application.CreateRibbonTab(tabName);
}
var ribbonPanel = application.CreateRibbonPanel(tabName, panelName);
var button1Data = new PushButtonData("Button1",
"Button1",
typeof(App).Assembly.Location,
"ButtonVideo.Button");
//图片地址
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
path = Path.Combine(Path.GetDirectoryName(path), "weather_sun.png");
button1Data.LargeImage = GetBitmapImage(path);
var button1 = ribbonPanel.AddItem(button1Data);
RibbonToolTip toolTip1 = new RibbonToolTip()
{
Title = "这是Button1",
Content = "这是命令简要内容",
ExpandedContent = "这是命令的扩展内容!",
//字符串不要换行,否则读不出来
//ExpandedVideo = new Uri(@"C:\Program Files\Autodesk\Revit 2016\videos\GUID-4D816758-AF71-455E-9FAE-A1D5ED237EC6-low.swf"),
ExpandedVideo = new Uri("C:/Program Files/Autodesk/Revit 2016/videos/GUID-4D816758-AF71-455E-9FAE-A1D5ED237EC6-low.swf"),
ExpandedImage = GetBitmapImage(path),
//IsHelpEnabled = true,
//IsProgressive = true
};
SetRibbonItemToolTip(button1, toolTip1);
return Result.Succeeded;
}
public BitmapImage GetBitmapImage(string imagePath)
{
if (File.Exists(imagePath))
return new BitmapImage(new Uri(imagePath));
else
return null;
}
void SetRibbonItemToolTip(RibbonItem item, RibbonToolTip toolTip)
{
//var ribbonItem = GetRibbonItem1(item);
var ribbonItem = GetRibbonItem2(item);
if (ribbonItem == null)
return;
ribbonItem.ToolTip = toolTip;
}
private Autodesk.Windows.RibbonItem GetRibbonItem1(
RibbonItem item)
{
Type itemType = item.GetType();
var mi = itemType.GetMethod("getRibbonItem",
BindingFlags.NonPublic | BindingFlags.Instance);
var windowRibbonItem = mi.Invoke(item, null);
return windowRibbonItem
as Autodesk.Windows.RibbonItem;
}
private Autodesk.Windows.RibbonItem GetRibbonItem2(
RibbonItem item)
{
RibbonControl ribbonControl
= RevitRibbonControl.RibbonControl;
//第二种方式获得RibbonControl
//RibbonControl ribbonControl = Autodesk.Windows.ComponentManager.Ribbon;
foreach (var tab in ribbonControl.Tabs)
{
if (tab.Id == App.tabName)
{
foreach (var panel in tab.Panels)
{
//panel.Source.Id------CustomCtrl_%VButton%Video tooltip
if (panel.Source.AutomationName == App.panelName)
{
foreach (var ribbonItem
in panel.Source.Items)
{
//ribbonItem.Id------------CustomCtrl_%CustomCtrl_%VButton%Video tooltip%Button1
if (ribbonItem.AutomationName
== item.Name)
{
return ribbonItem as
Autodesk.Windows.RibbonItem;
}
}
}
}
}
}
return null;
}
}
}
更详细的代码见: http://download.youkuaiyun.com/download/mye918/9970716