65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Ribbon for WinForms,第 16 部分 – ApplicationModes

starIconstarIconstarIconstarIconstarIcon

5.00/5 (12投票s)

2010年3月2日

Ms-PL

2分钟阅读

viewsIcon

25209

downloadIcon

1242

在本文中,我将介绍如何使用 ribbon 应用程序模式。

这系列 CodeProject 文章基于我首先在我的 博客上发表的一系列帖子。

Windows Ribbon for WinForms 库现在支持应用程序模式。这篇文章的结果是另一个示例,"13-ApplicationModes",可以在项目站点上找到。

image

image

什么是应用程序模式?

最好用例子来解释。应用程序有时有不同的“模式”,在这些模式下它们显示不同的 GUI,例如

  • 简单模式 vs. 高级模式
  • 常规编辑器模式 vs. 打印模式

ribbon 框架支持根据当前应用程序模式更改其 GUI。为了使用 ribbon 应用程序模式,您需要

  • 为每个 ribbon 项设置可用的应用程序模式。这是在设计时完成的。
  • 设置当前的应用程序模式。这是在运行时完成的。

总而言之,应用程序模式是一项功能,允许 ribbon 根据当前的应用程序上下文更改其 GUI。

有关此主题的更多详细信息,请参见 MSDN 上的 使用应用程序模式重新配置 Ribbon

使用 ApplicationModes - 额外说明

  • 您可以设置最多 32 种不同的应用程序模式,每种模式由 0 到 31 之间的数字标识。
  • 模式可以共存,这意味着您可以同时将简单模式和高级模式设置为活动状态。在内部,当前的应用程序模式由单个 32 位变量表示(它表示大小为 32 的布尔数组),从而解释了为什么您只能拥有 32 种模式。
  • 模式 0 是默认模式。因此,如果您没有设置 ApplicationModes 属性,则 0 为默认值。
  • 至少应始终设置一种模式。您无法禁用所有模式(框架只会忽略您的最后一次设置)。

使用 ApplicationModes - Ribbon 标记

以下是视图部分的示例,您可以在其中设置 ApplicationModes 属性

<Application.Views>
  <Ribbon>
    <Ribbon.Tabs>
      <Tab CommandName="cmdTabMain" ApplicationModes="0,1">
        <Group CommandName="cmdGroupCommon" 
               SizeDefinition="ThreeButtons" 
               ApplicationModes="0,1">
          <Button CommandName="cmdButtonNew" />
          <Button CommandName="cmdButtonOpen" />
          <Button CommandName="cmdButtonSave" />
        </Group>
        <Group CommandName="cmdGroupSimple" 
               SizeDefinition="TwoButtons" 
               ApplicationModes="0">
          <Button CommandName="cmdButtonSwitchToAdvanced" />
          <Button CommandName="cmdButtonDropA" />
        </Group>
        <Group CommandName="cmdGroupAdvanced" 
               SizeDefinition="FourButtons" 
               ApplicationModes="1">
          <Button CommandName="cmdButtonSwitchToSimple" />
          <Button CommandName="cmdButtonDropA" />
          <Button CommandName="cmdButtonDropB" />
          <Button CommandName="cmdButtonDropC" />
        </Group>
      </Tab>
    </Ribbon.Tabs>
  </Ribbon>
</Application.Views>

在此示例中,我们创建一个选项卡,其中包含三个组:Common、Simple 和 Advanced。 Common 组应始终显示,因此我们将其 ApplicationModes 属性设置为“0,1”。 Simple 组应仅在简单模式 (0) 下显示。 类似地,Advanced 组应仅在高级模式 (1) 下显示。 请注意,选项卡元素应在两种模式下都显示,因此您还必须将其 ApplicationModes 属性设置为“0,1”。

可以在以下元素上设置 ApplicationModes

  • 核心选项卡(与上下文选项卡相对)。
  • 作为核心选项卡子级的组。
  • ButtonSplitButtonDropDownButton,但仅当这些控件位于应用程序菜单中时。

ApplicationModes - 代码隐藏

以下是两个 ribbon 按钮,“简单”和“高级”,每个按钮都会更改当前的应用程序模式

private Ribbon _ribbon;
private RibbonButton _buttonSwitchToAdvanced;
private RibbonButton _buttonSwitchToSimple;

public Form1()
{
    InitializeComponent();

    _ribbon = new Ribbon();
    _buttonSwitchToAdvanced = new RibbonButton(_ribbon, 
                                (uint)RibbonMarkupCommands.cmdButtonSwitchToAdvanced);
    _buttonSwitchToSimple = new RibbonButton(_ribbon, 
                                (uint)RibbonMarkupCommands.cmdButtonSwitchToSimple);

    _buttonSwitchToAdvanced.OnExecute += 
        new OnExecuteEventHandler(_buttonSwitchToAdvanced_OnExecute);
    _buttonSwitchToSimple.OnExecute += 
        new OnExecuteEventHandler(_buttonSwitchToSimple_OnExecute);
}

void _buttonSwitchToAdvanced_OnExecute(PropertyKeyRef key, PropVariantRef currentValue, 
                                       IUISimplePropertySet commandExecutionProperties)
{
    _ribbon.SetModes(1);
}

void _buttonSwitchToSimple_OnExecute(PropertyKeyRef key, PropVariantRef currentValue, 
                                     IUISimplePropertySet commandExecutionProperties)
{
    _ribbon.SetModes(0);
}

Ribbon.SetModes 方法只是一个简单的包装器,可将字节数组转换为紧凑的 32 位整数并将其传递给相关的框架函数

public void SetModes(params byte[] modesArray)
{
    // check that ribbon is initialized
    if (!Initalized)
    {
        return;
    }

    // calculate compact modes value
    int compactModes = 0;
    for (int i = 0; i < modesArray.Length; ++i)
    {
        if (modesArray[i] >= 32)
        {
            throw new ArgumentException("Modes should range between 0 to 31.");
        }

        compactModes |= (1 << modesArray[i]);
    }

    // set modes
    Framework.SetModes(compactModes);        
}

目前就到这里为止。

© . All rights reserved.