我一直在想,只需点击一下,实现锁定/禁用一堆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;
}
}
}
}
我认为它看起来比以前的版本好很多。谢谢大家的帮助。
答案 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
}