Почему никто не написал класс RadioMenuItems для Winforms? - PullRequest
2 голосов
/ 02 июня 2010

Или, может быть, Google просто не так дружелюбен ко мне?

Что я хочу, так это простая вещь:

  • конструктор, который принимает массив объектов пунктов меню
  • Значение get / set свойство, которое установит все свойства Checked вправо
  • привязка ко всем событиям Clicked поставляемых предметов и предоставление одного события
  • Рабочие средства DataBind

Если вы столкнулись с такой приятной вещью, пожалуйста, направьте меня. Нет необходимости в ручных ссылках "сделай это в твоей форме.cs-class", пожалуйста. Это я могу сделать сам.

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

См .: http://msdn.microsoft.com/en-us/library/ms404318.aspx

Резюме: вам нужно будет создать новый подкласс ToolStripMenuItem, который переопределит методы OnCheckChanged, OnOwnerChanged и, возможно, OnPaint.

Обратите внимание, что в нашем случае мы оставляем галочку для пользовательского интерфейса, а не радиокнопку. Но сохраняйте эксклюзивную функциональность галочки.

1 голос
/ 05 июня 2010

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

// Usage example:    
//     
// ric = new RadioItemCoupler(new ToolStripMenuItem[] {     
//    neverToolStripMenuItem,     
//    alwaysToolStripMenuItem,     
//    errorsOnlyToolStripMenuItem     
// });    
// this.Controls.Add(ric);    
// _ric.DataBindings.Add("CheckedIndex", MySettings, "SmsReplyType",     
//    false, DataSourceUpdateMode.OnPropertyChanged);    

public class RadioItemCoupler : Control    
{    
    private int _checkedIndex;    

    // Zero-based    
    [Bindable(true)]    
    public int CheckedIndex    
    {    
        get { return _checkedIndex; }    
        set    
        {    
            _checkedIndex = value;    
            _items[value].Checked = true;    
        }    
    }    

    public event EventHandler CheckedIndexChanged;    

    ToolStripMenuItem[] _items;    

    private delegate void ItemHandler(ToolStripMenuItem item);    

    public RadioItemCoupler(ToolStripMenuItem[] items)    
    {    
        _items = items;    

        foreach (ToolStripMenuItem tsmi in _items)    
        {    
            tsmi.CheckOnClick = true;    
            tsmi.CheckedChanged += new EventHandler(tsmi_CheckedChanged);    
        }    
    }    

    void tsmi_CheckedChanged(object sender, EventArgs e)    
    {    
        ToolStripMenuItem that = sender as ToolStripMenuItem;    

        // Restore check if checked out    
        bool nothingChecked = true;    
        foreach(var item in _items)    
            nothingChecked = nothingChecked && !item.Checked;    
        if (nothingChecked)    
        {    
            _items[_checkedIndex].Checked = true;    
            return;    
        }    

        if (!that.Checked)     
            return;    

        for (int i = 0; i < _items.Length; i++)    
        {    
            if (that != _items[i])    
            {    
                if (_items[i].Checked)    
                    _items[i].Checked = false;    
            }    
            else    
            {    
                _checkedIndex = i;    

                if (CheckedIndexChanged != null)    
                    CheckedIndexChanged(this, EventArgs.Empty);    
            }    
        }    
    }    
}    
...