在本博客中,展示了如何在现有的WinForms应用中添加C1Themes控件支持。
本文使用名为C1dView Samples的应用程序,它包含C1Reports。它是基于C1Ribbon界面设计的C1Report/C1PrintDocument浏览应用程序。该应用最初没有包含主题的支持。
C1DView示例下载:C1dView.zip (94.96 kb)
如下描述的简单的步骤,为最终用户提供在程序中选择使用包含于C1Themes控件产品中的若干主题的支持。(请注意:在进行以下操作前请确保已经安装安装了ComponentOne Studio for WinForms的所有控件-C1Reports,C1Command,C1Ribbon与C1Themes。本文使用C#,同样的操作在VB里也是很简单的)
1.打开C1dView_2010.sln工程,在项目引用中添加C1.Win.C1Themes.4的DLL(如上所述,需要在系统中安装ComponentOne Studio for WinForms-包含C1Themes):
2.将theme selection combo添加到主程序窗体中的C1Ribbon控件的配置工具栏中。为此,我们需要在Visual studio form designer中打开C1dView.cs文件,点击C1Ribbon控件,然后在相应的属性窗体中扩展rbnMain ribbon的ConfigToolBar节点。之后,打开Items collection editor,它初始内容只包含Help menu帮助栏。
3.添加ComboBox项目到Items collection,把它的名字改成rcmbTheme。
4.关闭Collection editor,同时在属性选择下拉菜单中,选出刚刚添加的rcmbTheme项目(C1.Win.C1Ribbon.RibbonComboBox)。切换到事件选项卡,然后为combo添加两个事件处理-ChangeCommitted事件和DropDown事件。rcmbTheme_DropDown handler将为combo统计可用的主题名,而
rcmbTheme_ChangeCommitted 则会在窗体上自动应用选定的主题。同时combo相应标签中的内容也变更为”Theme:”。
5.上述步骤添加到DropDown事件的代码如下所示:
using C1.Win.C1Themes; ... private void rcmbTheme_DropDown(object sender, EventArgs e) { rcmbTheme.Items.Clear(); string[] themes = C1ThemeController.GetThemes(); foreach (string theme in themes) rcmbTheme.Items.Add(theme); }
第一行清楚列表以确保下拉菜单展开时没有多余信息显示(或者你可以将themes的list暂存下来以备复用)。下一行获取所有可用主题名。因为没有为工程添加任何自定义主题,此处可用主题都是集成到C1Themes中的标准主题。之后将这些主题加入combo中供用户选择。
6.ChangeCommitted事件中将选定主题应用到窗体中的代码简短,如下所示:
using C1.Win.C1Themes; ... private void rcmbTheme_ChangeCommitted(object sender, EventArgs e) { C1Theme theme = C1ThemeController.GetThemeByName(rcmbTheme.Text, false); if (theme != null) C1ThemeController.ApplyThemeToControlTree(this, theme); }
首先调用返回用户选择的主题名。第二个参数(false)声明了此处若出现用户未选定任何主题的情况程序不需要抛出异常。随后我们将选定的主题应用于窗体及其中的所有控件中。
7.经过这样的简单操作我们就已经完成了所有需要的操作。运行应用程序会发现应用主窗体的右上角会出现一个combobox(组合框),其中会列出置于C1Themes中的标准主题。选定其中一个主题,窗体以及其中所有控件的外观都变为相应主题风格,如下是VS2013DarkSolar主题选择后的截图示例:
最后再说几点:
1.如上描述的方法仅提供集成于C1Themes ssembly的标准主题。要使用其它主题(如使用C1ThemeDesigner制作或更改过的主题),还需额外的步骤。
2.此处并未添加任何代码使用户的主题选择具有持久性,用户必须每次在程序启动后自己选定主题(当然,这与让用户界面保持友好的原则背道而驰)。做些简单改变把每次用户选定的主题名称保存到应用的配置文件中并在每次应用启动时自动进行主题设置。更好的是使用C1.Win.C1Themes.C1ThemeLocator类型来替代主题名称这一简单的string变量会更好些。
在示例中将主题名称保存到了settings(配置)中,并将主题应用于新窗体,示例源代码如下:
3.这个C1dView应用支持新窗口的创建,需要添加代码将当前选择的主题应用到那些窗口。否则新窗口默认使用无主题的外观设置。