以编程方式更好的方式在function区栏上locking/禁用多个UI控件

我一直在想,通过点击来实现locking/禁用一堆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栏上添加了越来越多的控件,我不认为这样做会是一个很好的编程习惯。

有没有更干净整洁的方法呢? 我能够获得function区栏上所有控件的集合吗? 希望有人能在这里给我一些指点? 非常感谢。

编辑:

修改后的代码如下:

 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; } } } } 

我认为它比以前的版本好多了。 感谢大家的帮助。

当然,改善代码的第一步是删除if语句,并直接使用tbtnLock控件的选中状态来分配控件的启用状态,如…

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

如果半开始就会切断你的代码。 您可能希望先将其分配给布尔,然后再对其进行额外的处理(也许其他对象有助于确定locking状态)

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

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

但是,正如你所暗示的,我想看看试图find一个控件集合,通过它们循环,检查控件是不是tbtnLock控件,并根据需要禁用/启用。

另外,我build议将所有这些代码移到事件句柄之外的某个函数中,以防您需要从其他代码中调用此方法。 就像是…

 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; } } 

我不熟悉任何内置的.Netfunction区控件,因为没有链接到第三方设置)我正在猜测可用于“组”的属性

好像你可以把你所有的UI控件放在一个列表中,然后遍历它来一次性启用/禁用它们。 像(未经testing/伪代码):

 List<RibbonBase> listMyControls = new List<RibbonBase>() { control1, control2, control3, ... , controlN }; foreach (var control in listMyControls) { control.Enabled = !tbtnLock.Checked; } 

这里有一些代码将其扩展到整个选项卡。

  /// <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 }