Windows Ribbon库的更新与简化

首先,请求原谅。正在尝试创建一个易于使用的库,因此最近的库更新并不向后兼容。具体来说,类名和接口已经发生了变化。请放心,所做的每一个改变都是为了使库更加易于使用。然而,对于那些已经开始使用该库的人,说:对不起。[这就是使用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);

IUICommandHandler实现

为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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485