前言:我们想通过代码动态精确控制PushButton在哪些指定的情况下是不能使用的,哪些情况下是可以使用的 ,下面分享的是相关的api。
背景
项目有一个用户激活后才能使用对应的功能按钮的需求。需求分析得出,我们需要实时判断当前用户是否超过有效期,超过有效期的话,功能应该灰选,无法使用才行。
没有超有效期
超了有效期
IExternalCommandAvailability 接口
public interface IExternalCommandAvailability
{
bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories);
}
这个接口提供了按钮当前的UIApplication等参数,返回false的时候,按钮显示灰显;返回值为true的时候,按钮为正常使用。
这样子,我们只需要把是否过期的判断放在这个接口里面,然后返回对应的bool值就可以了。
完整使用代码
namespace RevitTest
{
public class App : IExternalApplication
{
public Result OnShutdown(UIControlledApplication application)
{
return Result.Succeeded;
}
public Result OnStartup(UIControlledApplication application)
{
string FamilyPath = typeof(App).Assembly.Location;
application.CreateRibbonTab("测试");
Autodesk.Revit.UI.RibbonPanel panel1 = application.CreateRibbonPanel("测试", "测试控件");
PushButtonData psbd1 = new PushButtonData(typeof(PatchColumnDemo).FullName, "放置柱子", FamilyPath, typeof(PatchColumnDemo).FullName);
psbd1.LargeImage = new BitmapImage(new Uri($@"{Path.GetDirectoryName(FamilyPath)}\显示楼板信息.png"));
PushButton ribbonItem = panel1.AddItem(psbd1) as PushButton;
ribbonItem.AvailabilityClassName = "RevitTest.AvailabilityClass";
return Result.Succeeded;
}
}
public class AvailabilityClass : IExternalCommandAvailability
{
public bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories)
{
return true;
}
}
}
给PushButton 的AvailabilityClassName 赋值,这里需要注意的是,传进去的是string值,因此,传进去的是IExternalCommandAvailability接口实现类的完整路径,即命名空间.类名
总结
这个类可以封装成基础类型,然后通过继承的方式实现控制所有按钮的可用性。也可以实现按钮再某个特定的视图下,不允许使用等效果