Лучший способ программно заблокировать / отключить несколько элементов управления пользовательского интерфейса на панели ленты - PullRequest
3 голосов
/ 19 октября 2011

Мне было интересно, что было бы лучшим способом реализовать блокировку / отключение набора элементов управления пользовательского интерфейса ленты одним щелчком мыши?

В настоящее время мой подход довольно прост и прост:

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

Я думаю, что все в порядке, если у нас есть только несколько элементов управления, но как только мы добавляем все больше и больше элементов управления на панель ленты, я не думаю, что было бы хорошей практикой кодирования делать вещи, как описано выше.

Есть ли более чистый и аккуратный подход к этому?Могу ли я получить коллекцию всех элементов управления на панели ленты?Надеюсь, кто-нибудь может дать мне несколько советов здесь?Спасибо большое.

РЕДАКТИРОВАТЬ:

Пересмотренный код ниже:

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 ]

3 голосов
/ 19 октября 2011

Ну, конечно, первым шагом к улучшению кода было бы удаление оператора if и присвоение включенного состояния элемента управления напрямую с проверенным состоянием элемента управления tbtnLock, например ...

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

это сократит ваш код, если наполовину сразу. Возможно, вы захотите присвоить это булевому первому случаю, если вы хотите выполнить дополнительную обработку позже (возможно, какой-то другой объект помогает определить состояние блокировки, например)

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 голос
/ 19 октября 2011

Похоже, вы можете поместить все свои элементы управления пользовательским интерфейсом в один список, а затем выполнить итерацию, чтобы включить / отключить их все сразу.Что-то вроде (непроверенный / псевдокод):

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

foreach (var control in listMyControls)
{
  control.Enabled = !tbtnLock.Checked;
}
0 голосов
/ 22 марта 2012

Вот некоторый код, чтобы расширить это на всю вкладку.

    /// <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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...