首先,请求原谅。正在尝试创建一个易于使用的库,因此最近的库更新并不向后兼容。具体来说,类名和接口已经发生了变化。请放心,所做的每一个改变都是为了使库更加易于使用。然而,对于那些已经开始使用该库的人,说:对不起。[这就是使用BETA项目所得到的结果。]
类名:为所有Ribbon控件辅助类添加了"Ribbon"前缀。这是为了防止与标准WinForms控件(如Button、ComboBox等)发生冲突。
是的,知道,这就是拥有命名空间的原因。然而,在WinForms项目中同时拥有一个按钮和一个Ribbon按钮并不是罕见的情况。当这种情况发生时,用户无法添加"using RibbonLib.Controls;",因此几乎每一行代码都会被"RibbonLib.Controls"前缀所污染,例如:
C# RibbonLib.Controls.Button ribbonButton = new RibbonLib.Controls.Button(_ribbon, commandId);
而不是:
C# RibbonButton ribbonButton = new RibbonButton(_ribbon, commandId);
为Ribbon类添加了IUICommandHandler的一般实现(Execute和UpdateProperty函数),以便用户不再需要在Form类中实现这些方法。这意味着用户不再需要编写以下代码:
C# public HRESULT Execute(uint commandId, ExecutionVerb verb, PropertyKeyRef key, PropVariantRef currentValue, IUISimplePropertySet commandExecutionProperties) {
switch (commandId) {
case (uint)RibbonMarkupCommands.cmdDropDownColorPickerGroup:
_groupColors.Execute(verb, key, currentValue, commandExecutionProperties);
break;
case (uint)RibbonMarkupCommands.cmdButtonsGroup:
_groupButtons.Execute(verb, key, currentValue, commandExecutionProperties);
break;
// 更多case...
}
return HRESULT.S_OK;
}
新的实现位于Ribbon类中,它根据命令ID将调用委托给正确的Ribbon控件:
C# public virtual HRESULT Execute(uint commandID, ExecutionVerb verb, PropertyKeyRef key, PropVariantRef currentValue, IUISimplePropertySet commandExecutionProperties) {
if (_mapRibbonControls.ContainsKey(commandID)) {
_mapRibbonControls[commandID].Execute(verb, key, currentValue, commandExecutionProperties);
}
return HRESULT.S_OK;
}
_mapRibbonControls是一个内部字典,包含用户在主表单中创建的所有Ribbon控件辅助类。
注意:将这些函数设置为virtual,以便如果某些用户想要直接访问Ribbon框架的通知,他仍然可以通过派生自Ribbon类并覆盖这些方法来获得它们。
现在,可以将Ribbon资源放在外部DLL中,而不是在应用程序可执行文件中作为本地资源。对于需要将本地资源用于其他用途的开发者来说,这是一个问题(例如,设置应用程序图标)。
实际上,已经将此作为Ribbon的默认行为。所以现在,当调用最简单的形式的Ribbon.InitFramework时,Ribbon库会尝试从your_app_name.ribbon.dll加载Ribbon,如果找不到该文件,它将回退到以前的行为,即尝试从可执行文件本地资源加载Ribbon。
当然,可以提供自己的DLL名称来加载,甚至可以自己加载它并将DLL句柄(=LoadLibrary返回的内容)传递给Ribbon.InitFramework的不同重载。这允许实现自定义的Ribbon加载机制,这在希望根据不同场景加载不同的Ribbon时非常有用,例如,添加本地化支持(不同的本地化有不同的Ribbon)。
这对Ribbon库的用户意味着他需要在预构建事件中添加一个额外的步骤。这一步将从先前步骤创建的资源文件创建Ribbon资源DLL。因此,现在使用Ribbon库的项目预构建事件是:
"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.0\Bin\UICC.exe" "$(ProjectDir)RibbonMarkup.xml" "$(ProjectDir)RibbonMarkup.bml" /res:"$(ProjectDir)RibbonMarkup.rc"
"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.0\Bin\rc.exe" /v "$(ProjectDir)RibbonMarkup.rc"
cmd /c "("$(DevEnvDir)..\..\VC\bin\vcvars32.bat") && ("$(DevEnvDir)..\..\VC\bin\link.exe" /VERBOSE /NOENTRY /DLL /OUT:"$(ProjectDir)$(OutDir)$(TargetName).ribbon.dll" "$(ProjectDir)RibbonMarkup.res")
知道,这看起来像一堆垃圾,但实际上所写的是:
UICC - 请将RibbonMarkup.xml转换为RibbonMarkup.rc
rc - 请将RibbonMarkup.rc转换为RibbonMarkup.res
link - 请将RibbonMarkup.res转换为YourAppName.ribbon.dll