@@ -4,18 +4,22 @@ using System.IO;
using System.Reflection ;
using System.Runtime.InteropServices ;
using System.Windows ;
using System.Windows.Input ;
using System.Windows.Interop ;
using System.Windows.Media.Imaging ;
using Autodesk.Revit.DB ;
using Autodesk.Revit.UI ;
using adWin = Autodesk . Windows ;
using CommunityToolkit.Diagnostics ;
using UIFramework ;
using UIFrameworkServices ;
using System.Runtime.CompilerServices ;
using Sai.Toolkit.Mvvm.Attributes ;
using adWin = Autodesk . Windows ;
namespace Sai.Toolkit.Revit.Assist ;
@@ -23,15 +27,55 @@ public static class UIAssist
{
private static readonly string AddInPath = typeof ( UIAssist ) . Assembly . Location ;
/// <summary>
/// 查找内容
/// </summary>
/// <param name="hwndParent"></param>
/// <param name="hwndChildAfter"></param>
/// <param name="lpszClass"></param>
/// <param name="lpszWindow"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindowEx (
IntPtr hwndParent ,
IntPtr hwndChildAfter ,
string lpszClass ,
string lpszWindow
) ;
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern bool SetWindowText ( IntPtr hWnd , string lpString ) ;
private static BitmapSource ToBitmapSource ( Bitmap bitmap )
/// <summary>
/// 面板上添加项
/// </summary>
/// <param name="panel"></param>
/// <param name="item"></param>
public static void AddAwItem ( this adWin . RibbonPanel panel , adWin . RibbonItem item )
{
return bitmap = = null
? null
: Imaging . CreateBitmapSourceFromHBitmap ( bitmap . GetHbitmap ( ) , IntPtr . Zero , Int32Rect . Empty , BitmapSizeOptions . FromEmptyOptions ( ) ) ;
panel . Source . Items . Add ( item ) ;
}
/// <summary>
/// 添加堆叠按钮组
/// </summary>
/// <param name="rowPanel"></param>
/// <param name="ribbonButtons"></param>
public static void AddAwStackItems ( this adWin . RibbonRowPanel rowPanel , params adWin . RibbonButton [ ] ribbonButtons )
{
for ( var i = 0 ; i < ribbonButtons . Length ; i + + )
{
rowPanel . Items . Add ( ribbonButtons [ i ] ) ;
//添加一个,打断一次
if ( i < ribbonButtons . Length - 1 )
{
//行打断=新建行
rowPanel . Items . Add ( new adWin . RibbonRowBreak ( ) ) ;
}
}
}
/// <summary>
/// Combobox是可以分组的
/// 组合框是与事件结合使用的
@@ -57,27 +101,7 @@ public static class UIAssist
} ;
return comboBx ;
}
/// <summary>
/// 在Revit现有的标签下( 如不存在则创建) , 创建创建面板
/// </summary>
/// <param name="application"></param>
/// <param name="panelName">创建的面板名称</param>
/// <param name="tabName">若Tab不存在, 则创建对应名称的Tab</param>
/// <returns></returns>
public static RibbonPanel AddPanel ( this UIControlledApplication application , string panelName , string tabName )
{
var ribbonTab = adWin . ComponentManager . Ribbon . Tabs . FirstOrDefault ( tab = > tab . Id . Equals ( tabName ) ) ;
if ( ribbonTab is null )
{
application . CreateRibbonTab ( tabName ) ;
return application . CreateRibbonPanel ( tabName , panelName ) ;
}
var ribbonPanel = application . GetRibbonPanels ( tabName ) . Find ( panel = > panel . Name . Equals ( panelName ) ) ;
return ribbonPanel ? ? application . CreateRibbonPanel ( tabName , panelName ) ;
}
/// <summary>
/// 创建一个下拉式按钮。
@@ -146,37 +170,6 @@ public static class UIAssist
return data ;
}
/// <summary>
/// 单选框
/// </summary>
/// <param name="pnl">面板</param>
/// <param name="groupName">分组名称</param>
/// <param name="toggleButtonData"></param>
/// <returns></returns>
public static RadioButtonGroup AddRadioButtonGroup (
this RibbonPanel pnl ,
string groupName ,
params ToggleButtonData [ ] toggleButtonData
)
{
if ( pnl is null )
{
throw new ArgumentNullException ( nameof ( pnl ) ) ;
}
if ( string . IsNullOrEmpty ( groupName ) )
{
throw new ArgumentNullException ( nameof ( groupName ) ) ;
}
RadioButtonGroupData groupData = new ( groupName ) ;
var radioButtonGroup = ( RadioButtonGroup ) pnl . AddItem ( groupData ) ;
foreach ( var data in toggleButtonData )
{
radioButtonGroup . AddItem ( data ) ;
}
return radioButtonGroup ;
}
/// <summary>
/// 创建一个分割记忆按钮。
/// </summary>
@@ -220,18 +213,7 @@ public static class UIAssist
return result ;
}
public static void AddStackItems ( this adWin . RibbonRowPanel rowPanel , params adWin . RibbonButton [ ] ribbonButtons )
{
for ( var i = 0 ; i < ribbonButtons . Length ; i + + )
{
rowPanel . Items . Add ( ribbonButtons [ i ] ) ;
if ( i < ribbonButtons . Length - 1 )
{
//行打断=新建行
rowPanel . Items . Add ( new adWin . RibbonRowBreak ( ) ) ;
}
}
}
public static void AddTextBox ( this RibbonPanel panel , TextBoxData txtBoxData )
{
@@ -247,13 +229,38 @@ public static class UIAssist
} ;
txtBox . Width = 180 ;
}
public static ToggleButton AddToggleButton < T > ( this RadioButtonGroup group , string name )
where T : IExternalCommand
/// <summary>
/// 在Revit现有的标签下( 如不存在则创建) , 创建创建面板
/// </summary>
/// <param name="application"></param>
/// <param name="panelName">创建的面板名称</param>
/// <param name="tabName">若Tab不存在, 则创建对应名称的Tab</param>
/// <returns></returns>
public static RibbonPanel AddUIPanel ( this UIControlledApplication application , string tabName , string panelName )
{
//var addInPath = typeof(T).Assembly.Location ;
var toggleData = new ToggleButtonData ( name , name , typeof ( T ) . Assembly . Location , typeof ( T ) . FullName ) ;
return group . AddItem ( toggleData ) ;
var ribbonTab = adWin . ComponentManager . Ribbon . Tabs . FirstOrDefault ( tab = > tab . Id . Equals ( tabName ) ) ;
if ( ribbonTab = = null )
{
application . CreateRibbonTab ( tabName ) ;
return application . CreateRibbonPanel ( tabName , panelName ) ;
}
var ribbonPanel = application . GetRibbonPanels ( tabName ) . Find ( panel = > panel . Name . Equals ( panelName ) ) ;
return ribbonPanel ? ? application . CreateRibbonPanel ( tabName , panelName ) ;
}
public static adWin . RibbonItem ConvertToAwRibbonItem ( this RibbonButton btn )
{
return ( adWin . RibbonItem ) btn . GetType ( )
. InvokeMember (
"getRibbonItem" ,
BindingFlags . NonPublic | BindingFlags . Instance | BindingFlags . InvokeMethod ,
Type . DefaultBinder ,
btn ,
null
) ;
}
/// <summary>
@@ -287,26 +294,82 @@ public static class UIAssist
{
return new PushButtonData ( typeof ( T ) . FullName , name , typeof ( T ) . Assembly . Location , typeof ( T ) . FullName ) ;
}
/// <summary>
/// 查找内容
/// 查找面板
/// </summary>
/// <param name="hwndParen t"></param>
/// <param name="hwndChildAfter "></param>
/// <param name="lpszClass"></param>
/// <param name="lpszWindow"></param>
/// <param name="r t"></param>
/// <param name="panelName "></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindowEx (
IntPtr hwndParent ,
IntPtr hwndChildAfter ,
string lpszClass ,
string lpszWindow
) ;
public static adWin . RibbonPanel FindAwPanel ( this adWin . RibbonTab rt , string panelName )
{
return rt . Panels . FirstOrDefault ( p = > p . Source . Name = = panelName ) ;
}
/// <summary>
/// 查找Tab
/// </summary>
/// <param name="tabName">标签名</param>
/// <returns></returns>
public static adWin . RibbonTab FindAwTab ( string tabName )
{
return adWin . ComponentManager . Ribbon . Tabs . FirstOrDefault ( tab = > tab . Id . Equals ( tabName ) ) ;
}
public static ToggleButton GetToggleButton ( this RadioButtonGroup radioButtonGroup )
{
return radioButtonGroup . Current ;
}
/// <summary>
/// 创建按钮
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="showText"></param>
/// <param name="largeImage"></param>
/// <param name="image"></param>
/// <param name="command">RelayCommand</param>
/// <param name="parameter">命令的参数</param>
/// <param name="toolTip"></param>
/// <returns></returns>
public static adWin . RibbonButton NewAwButton ( string showText , Bitmap largeImage , Bitmap image , ICommand command , object parameter , string toolTip = default )
{
return new ( )
{
Image = image . ToBitmapSource ( ) ,
LargeImage = largeImage . ToBitmapSource ( ) ,
Size = adWin . RibbonItemSize . Standard ,
ShowText = true ,
Id = $"ID_{showText}" ,
Name = $"Btn_{showText}" ,
ToolTip = toolTip ? ? showText ,
Text = showText ,
IsCheckable = true ,
CommandHandler = command ,
CommandParameter = parameter ,
//Orientation = System.Windows.Controls.Orientation.Vertical
} ;
}
/// <summary>
/// 创建ToggleButton
/// </summary>
/// <param name="showText"></param>
/// <param name="largeImage"></param>
/// <param name="toolTip"></param>
/// <returns></returns>
public static adWin . RibbonToggleButton NewAwToggleButton ( string showText , Bitmap largeImage , string toolTip = null )
{
return new adWin . RibbonToggleButton ( )
{
LargeImage = largeImage ? . ToBitmapSource ( ) ,
Size = adWin . RibbonItemSize . Large ,
ToolTip = toolTip ? ? showText ,
ShowText = true ,
Id = $"ID_{showText}" ,
Name = $"Tog_{showText}" ,
Text = showText ,
IsCheckable = true ,
Orientation = System . Windows . Controls . Orientation . Vertical ,
} ;
}
/// <summary>
/// Revit默认打开文件对话框
@@ -332,24 +395,66 @@ public static class UIAssist
return filename ;
}
/// <summary>
/// 设置按钮可用性
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="pushButtonData"></param>
/// <returns></returns>
public static PushButtonData SetAvailability < T > ( this PushButtonData pushButtonData )
where T : IExternalCommandAvailability
{
pushButtonData . AvailabilityClassName = typeof ( T ) . FullName ;
return pushButtonData ;
}
/// <summary>
/// 设置面板右下角箭头对话框
/// </summary>
public static void SetAwDialogLauncher ( this adWin . RibbonPanel panel , adWin . RibbonCommandItem item )
{
if ( panel ! = null )
{
panel . Source . DialogLauncher = item ;
}
}
public static adWin . RibbonItem SetAwImage ( this adWin . RibbonItem ribbonItem , Bitmap image )
{
ribbonItem . Image = image . ToBitmapSource ( ) ;
return ribbonItem ;
}
public static void SetAwImage ( this adWin . RibbonItem ribbonItem , string uri )
{
ribbonItem . Image = new BitmapImage ( new Uri ( uri , UriKind . RelativeOrAbsolute ) ) ;
}
public static adWin . RibbonItem SetAwLargeImage ( this adWin . RibbonItem ribbonItem , Bitmap largeImage )
{
ribbonItem . LargeImage = largeImage . ToBitmapSource ( ) ;
return ribbonItem ;
}
/// <summary>
/// 指定决定按钮可用性的类别
/// 从 URI 源添加 32x32px-96dpi 图像
/// </summary>
/// <param name="button">功能区中将受限制 的按钮</param>
/// <type param name="T">类型继承 <see cref="Autodesk.Revit.UI.IExternalCommandAvailability"/></type param>
/// <remarks>T 类应与插件 "外部命令 "共享同一程序集</remarks >
public static void SetAvailabilityController < T > ( this PushButton button )
where T : IExternalCommandAvailability , new ( )
/// <param name="button">添加图标 的按钮</param>
/// <param name="uri">图标的相对或绝对路径</ param>
/// <example>button.SetAwLargeImage("/RevitAddIn;component/Resources/Icons/RibbonIcon32.png")</example >
public static void SetAwLargeImage ( this adWin . RibbonItem ribbonItem , string uri )
{
button . AvailabilityClassName = typeof ( T ) . FullName ;
ribbonItem . LargeImage = new BitmapImage ( new Uri ( uri , UriKind . RelativeOrAbsolute ) ) ;
}
public static adWin . RibbonItem SetAwShowText ( this adWin . RibbonItem ribbonItem , string text )
{
ribbonItem . Text = text ;
return ribbonItem ;
}
public static adWin . RibbonItem SetAwToolTip ( this adWin . RibbonItem ribbonItem , string tooltip )
{
ribbonItem . ToolTip = tooltip ;
return ribbonItem ;
}
public static PushButtonData SetDescription ( this PushButtonData pushButtonData , string longDescription )
@@ -357,31 +462,26 @@ public static class UIAssist
pushButtonData . LongDescription = longDescription ;
return pushButtonData ;
}
/// <summary>
/// 右下角箭头对话框
/// 设置面板 右下角箭头对话框
/// </summary>
public static void SetDialogLauncher ( string panelName )
public static void SetDialogLauncher ( string tabName , string panelName )
{
var group = adWin . ComponentManager . Ribbon . Tabs
. First( )
. Panels . FirstOrDefault ( p = > p . AutomationName = = panelName ) ;
if ( group ! = null )
{
group . Source . DialogLauncher = group . Source . Items . First ( ) as adWin . RibbonCommandItem ;
}
. FirstOrDefault ( tab = > tab . Name = = tabName )
. Panels . FirstOrDefault ( p = > p . AutomationName = = panelName ) ? ? throw new ArgumentException ( "未找到标签或面板" ) ;
group . Source . DialogLauncher = group . Source . Items . First ( ) as adWin . RibbonCommandItem ;
}
/// <summary>
/// 设置面板右下角箭头对话框
/// </summary>
public static void SetDialogLauncher ( adWin . RibbonTab tab , string panelName )
{
var group = tab . Panels . FirstOrDefault ( p = > p . AutomationName = = panelName ) ? ? throw new ArgumentException ( "未找到标签或面板" ) ;
group . Source . DialogLauncher = group . Source . Items . First ( ) as adWin . RibbonCommandItem ;
}
/// <summary>
/// 右下角箭头对话框
/// </summary>
public static void SetDialogLauncher ( this adWin . RibbonPanel panel , adWin . RibbonCommandItem item )
{
if ( panel ! = null )
{
panel . Source . DialogLauncher = item ;
}
}
/// <summary>
/// 双击选项
/// </summary>
@@ -392,14 +492,17 @@ public static class UIAssist
doubleOpt . SetAction ( target , clickAction ) ;
}
/// <summary>
/// 提示包含短视频
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="title"></param>
/// <param name="videoPath"></param>
/// <param name="videoPath">视频路径 </param>
public static void SetExpandedVideo ( this PushButtonData pushButtonData , string title , string videoPath )
{
//拿到Autodesk.Windows的RibbonItem( 转换)
var internalGetRibbonItemMethod = typeof ( RibbonItem ) . GetMethod (
"getRibbonItem" ,
BindingFlags . NonPublic | BindingFlags . Instance
@@ -410,17 +513,31 @@ public static class UIAssist
button . ToolTip = new adWin . RibbonToolTip { Title = title , ExpandedVideo = new Uri ( videoPath ) } ;
}
}
/// <summary>
/// 设置16x16的小图片
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="image"></param>
/// <returns></returns>
public static PushButtonData SetImage ( this PushButtonData pushButtonData , Bitmap image )
{
pushButtonData . Image = ToBitmapSource ( image ) ;
pushButtonData . Image = image . ToBitmapSource( ) ;
return pushButtonData ;
}
/// <summary>
/// 使用Uri设置16x16的小图片
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="uri"></param>
public static PushButtonData SetImage ( this PushButtonData pushButtonData , string uri )
{
pushButtonData . Image = new BitmapImage ( new Uri ( uri , UriKind . RelativeOrAbsolute ) ) ;
return pushButtonData ;
}
public static void SetImage ( this RibbonButton button , string uri )
{
button . Image = new BitmapImage ( new Uri ( uri , UriKind . RelativeOrAbsolute ) ) ;
}
/// <summary>
/// 消息中心
@@ -441,23 +558,30 @@ public static class UIAssist
} ; // 当鼠标点击气泡内容时触发此事件
paletteMgr . ShowBalloon ( resultItem ) ;
}
/// <summary>
/// 设置32x32-96dpi的大图片
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="largeImage"></param>
/// <returns></returns>
public static PushButtonData SetLargeImage ( this PushButtonData pushButtonData , Bitmap largeImage )
{
pushButtonData . LargeImage = ToBitmapSource ( largeImage ) ;
pushButtonData . LargeImage = largeImage . ToBitmapSource( ) ;
return pushButtonData ;
}
/// <summary>
/// Adds a 32x32px-96dpi image from the URI source
/// 从 URI 源添加 32x32px-96dpi 图像
/// </summary>
/// <param name="button">Button to which the icon will be added </param>
/// <param name="uri">Relative or Absolute path to the icon </param>
/// <example>button.SetLargeImage("/RevitAddIn;component/Resources/Icons/RibbonIcon32.png")</example>
public static void SetLargeImage ( this RibbonButton b utton, string uri )
/// <param name="pushButtonData">添加图标的按钮 </param>
/// <param name="uri">图标的相对或绝对路径 </param>
/// <example>button.SetAw LargeImage("/RevitAddIn;component/Resources/Icons/RibbonIcon32.png")</example>
public static void SetLargeImage ( this PushButtonData pushB uttonData , string uri )
{
b utton. LargeImage = new BitmapImage ( new Uri ( uri , UriKind . RelativeOrAbsolute ) ) ;
pushB uttonData . LargeImage = new BitmapImage ( new Uri ( uri , UriKind . RelativeOrAbsolute ) ) ;
}
/// <summary>
/// 状态栏
/// </summary>
@@ -478,84 +602,36 @@ public static class UIAssist
}
/// <summary>
/// 基于Revit封装的RibbonButton设置其快捷键.
/// 设置显示文字
/// </summary>
/// <param name="btn">RibbonButton. </param>
/// <param name="key">快捷键字符串. </param>
/// <param name="pushButtonData"> </param>
/// <param name="text"> </param>
/// <returns></returns>
public static bool SetShortCut ( this Autodesk . Revit . UI . RibbonButton btn , string key )
{
if ( btn = = null )
return false ;
var item = btn . GetType ( )
. InvokeMember (
"getRibbonItem" ,
BindingFlags . NonPublic | BindingFlags . Instance | BindingFlags . InvokeMethod ,
Type . DefaultBinder ,
btn ,
null
) ;
return item ! = null & & ( item as Autodesk . Windows . RibbonItem ) . SetShortCut ( key ) ;
}
/// <summary>
/// 基于通用库封装的RibbonCommandItem设置其快捷键.
/// </summary>
/// <param name="commandItem">RibbonCommandItem.</param>
/// <param name="key">快捷键字符串.</param>
/// <returns></returns>
public static bool SetShortCut ( this Autodesk . Windows . RibbonItem commandItem , string key )
{
if ( commandItem = = null | | string . IsNullOrEmpty ( key ) )
return false ;
Autodesk . Windows . ComponentManager . Ribbon . FindItem (
commandItem . Id ,
false ,
out var parentPanel ,
out var parentTab ,
true
) ;
if ( parentTab = = null | | parentPanel = = null )
return false ;
var path = string . Format ( "{0}>{1}" , parentTab . Id , parentPanel . Source . Id ) ;
var cmdId = ControlHelper . GetCommandId ( commandItem ) ;
if ( string . IsNullOrEmpty ( cmdId ) )
{
cmdId = Guid . NewGuid ( ) . ToString ( ) ;
ControlHelper . SetCommandId ( commandItem , cmdId ) ;
}
var shortcutItem = new ShortcutItem ( commandItem . Text , cmdId , key , path )
{
ShortcutType = StType . RevitAPI
} ;
UIFrameworkServices . KeyboardShortcutService . applyShortcutChanges (
new Dictionary < string , ShortcutItem > ( ) { { cmdId , shortcutItem } }
) ;
return true ;
}
public static PushButtonData SetShowText ( this PushButtonData pushButtonData , string text )
{
pushButtonData . Text = text ;
return pushButtonData ;
}
/// <summary>
/// 设置工具提示
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="tooltip"></param>
/// <returns></returns>
public static PushButtonData SetToolTip ( this PushButtonData pushButtonData , string tooltip )
{
pushButtonData . ToolTip = tooltip ;
return pushButtonData ;
}
/// <summary>
/// 设置工具提示图片
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="toolTipImage"></param>
/// <returns></returns>
public static PushButtonData SetToolTipImage ( this PushButtonData pushButtonData , Bitmap toolTipImage )
{
pushButtonData . ToolTipImage = ToBitmapSource ( toolTipImage ) ;
pushButtonData . ToolTipImage = toolTipImage . ToBitmapSource( ) ;
return pushButtonData ;
}
@@ -563,15 +639,19 @@ public static class UIAssist
/// 通过判断keyTip来区分原始Tab与插件Tab, 然后切换插件Tab的可见性
/// </summary>
/// <param name="tabName"></param>
public static void SetVisible ( string tabName )
/// <param name="visible"></param>
public static void SetVisible ( string tabName , bool visible )
{
var ribbonControl = adWin . ComponentManager . Ribbon ;
foreach ( var tab in ribbonControl . Tabs )
var tab = ribbonControl . Tabs
. FirstOrDefault (
tab = > ! tab . IsContextualTab & &
! tab . IsMergedContextualTab & &
tab . KeyTip = = null & &
tabName = = tab . Name ) ;
if ( tab ! = null )
{
if ( ! tab . IsContextualTab & & ! tab . IsMergedContextualTab & & tab . KeyTip = = null & & tabName = = tab . Nam e)
{
tab . IsVisible = ! tab . IsVisible ;
}
tab . IsVisible = visibl e;
}
}
@@ -579,23 +659,23 @@ public static class UIAssist
/// <summary>
/// 新建命令按钮
/// </summary>
/// <typeparam name="T "></typeparam>
/// <typeparam name="Command "></typeparam>
/// <param name="text"></param>
/// <param name="image"></param>
/// <param name="largeImage"></param>
/// <param name="toolTip"></param>
/// <param name="longDescription"></param>
/// <returns></returns>
public static PushButtonData NewButtonData < T > (
public static PushButtonData NewPush ButtonData < Command > (
string text ,
Bitmap largeImage = null ,
Bitmap image = null ,
string toolTip = null ,
string longDescription = null
)
where T : class , IExternalCommand
where Command : class , IExternalCommand
{
return new ( typeof ( T ) . FullName , text , AddInPath , typeof ( T ) . FullName )
return new ( typeof ( Command ) . FullName , text , AddInPath , typeof ( Command ) . FullName )
{
LargeImage = largeImage ? . ToBitmapSource ( ) ,
Image = image ? . ToBitmapSource ( ) ,
@@ -607,32 +687,33 @@ public static class UIAssist
/// <summary>
/// 新建可控的命令按钮
/// </summary>
/// <typeparam name="T "></typeparam>
/// <typeparam name="V "></typeparam>
/// <typeparam name="Command "></typeparam>
/// <typeparam name="Availablility "></typeparam>
/// <param name="text"></param>
/// <param name="bitmap"></param>
/// <param name="largeBitmap"></param>
/// <param name="toolTip"></param>
/// <param name="longDescription"></param>
/// <returns></returns>
public static PushButtonData NewButtonData < T , V > (
public static PushButtonData NewButtonData < Command , Availablility > (
string text ,
Bitmap largeBitmap = null ,
Bitmap bitmap = null ,
string toolTip = null ,
string longDescription = null
)
where T : class , IExternalCommand
where V : class , IExternalCommandAvailability
where Command : class , IExternalCommand
where Availablility : class , IExternalCommandAvailability
{
return new ( typeof ( T ) . FullName , text , AddInPath , typeof ( T ) . FullName )
return new ( typeof ( Command ) . FullName , text , AddInPath , typeof ( Command ) . FullName )
{
LargeImage = largeBitmap ? . ToBitmapSource ( ) ,
Image = bitmap ? . ToBitmapSource ( ) ,
ToolTip = toolTip ? ? text ,
LongDescription = longDescription ,
AvailabilityClassName = typeof ( V ) . FullName
AvailabilityClassName = typeof ( Availablility ) . FullName
} ;
}
#endregion
}