以编程方式锁定/禁用功能区栏上的多个UI控件的更好方法

时间:2011-10-19 15:49:16

标签: c# excel vsto ribbon

我一直在想,只需点击一下,实现锁定/禁用一堆Ribbon UI控件的更好方法是什么?

目前,我的方法有点简单和基本:

private void tbtnLock_Click(object sender, RibbonControlEventArgs e)
       {
           if (tbtnLock.Checked)
           {
               control1.Enabled = false;
               control2.Enabled = false;
               control3.Enabled = false;
               //...
               //controlN.Enabled = false;
           }
           else
           {
               control1.Enabled = true;
               control2.Enabled = true;
               control3.Enabled = true;
               //...
               //controlN.Enabled = true;
           }
       }

我认为如果我们只有一些控件可以,但是一旦我们在Ribbon栏上添加越来越多的控件,我认为做上面这样的事情并不是一个好的编码实践。

有没有更清洁,更整洁的方法?我能够获得Ribbon栏上所有控件的集合吗?希望有人能在这里给我一些指示?非常感谢。

编辑:

以下修订代码:

private void tbtnLock_Click(object sender, RibbonControlEventArgs e)
        {
            toggleUILockState();
        }
private void toggleUILockState()
        {
            if (group1.Items != null)
            {
                foreach (RibbonControl c in group1.Items)
                {
                    if (c.Name != "tbtnLock")
                    {
                        c.Enabled = !tbtnLock.Checked;
                    }
                }
            }
        }

我认为它看起来比以前的版本好很多。谢谢大家的帮助。

3 个答案:

答案 0 :(得分:3)

当然,改进代码的第一步是删除if语句并直接使用tbtnLock控件的已检查状态分配控件的启用状态,如...

control1.Enabled = !tbtnLock.Checked;
control2.Enabled = !tbtnLock.Checked;

如果一半就会切断你的代码。您可能希望稍后将其分配给bool,以便稍后对其进行额外处理(例如,某些其他对象可帮助确定锁定状态)

bool isEnabled = !tbtnLock.Checked;

control1.Enabled = isEnabled;
control2.Enabled = isEnabled;

除此之外,我需要知道你正在使用什么“功能区”控件。你有链接吗?

但是正如你所暗示的那样,我想看看试图找到一组控件,循环它们,检查控件是不是tbtnLock控件,并根据需要禁用/启用。

此外,我建议将所有这些代码移动到事件句柄之外的函数中,以防您需要从其他代码调用此方法。有点像...

private void tbtnLock_Click(object sender, RibbonControlEventArgs e)
{
   UpdateRibbonState();
}

private void UpdateRibbonState(){
   //Code goes here
}

编辑:假设“群组”(如评论中所述)有一系列控件......

foreach(Control c in group.Controls)
{
   if(c.Name != "tbtnLock")
   {
      c.Enabled = !tbtnLock.Checked;
   }
}

我不熟悉任何内置的.Net功能区控件,因为没有链接到第三方设置)我正在对“组”的可用属性进行最佳猜测

答案 1 :(得分:1)

似乎您可以将所有UI控件放入一个列表中,然后迭代它以立即启用/禁用它们。像(未经测试/伪代码)的东西:

List<RibbonBase> listMyControls = new List<RibbonBase>()
{
  control1, control2, control3, ... , controlN
};

foreach (var control in listMyControls)
{
  control.Enabled = !tbtnLock.Checked;
}

答案 2 :(得分:0)

以下是一些将此扩展到整个标签的代码。

    /// <summary>
    /// Enable or Disable all buttons in all groups of the RibbonTab to match toggleButtonActive
    /// toggleButtonActive remains enabled
    /// </summary>
    /// <param name="enabled"></param>
    private void SetUILockState(bool enabled)
    {
        foreach (RibbonGroup group in myRibbonTab.Groups)
        {
            if (group.Items != null)
            {
                foreach (RibbonControl c in group.Items)
                {
                    if (c.Name != "toggleButtonActive")
                    {
                        c.Enabled = enabled;
                    }
                }
            }

        }
        // TODO handle right click menus as well
    }