或者,Google可能對我不友好?爲什麼沒有人爲Winforms寫了RadioMenuItems類?
我想是這樣簡單的事情:接受菜單項的對象的數組
- 構造
- 價值獲得,將設定好的
- 綁定了經過性能到所有點擊/設置屬性所提供的項目的事件,並提供一個事件
- 工作的DataBind設施
如果您遇到這樣一個不錯的東西,請直接指導我。請不要手動做你的form1.cs-class鏈接。這我可以自己做。
或者,Google可能對我不友好?爲什麼沒有人爲Winforms寫了RadioMenuItems類?
我想是這樣簡單的事情:接受菜單項的對象的數組
如果您遇到這樣一個不錯的東西,請直接指導我。請不要手動做你的form1.cs-class鏈接。這我可以自己做。
參見:http://msdn.microsoft.com/en-us/library/ms404318.aspx
總結:你必須作出新的ToolStripMenuItem的子類,覆蓋OnCheckChanged,OnOwnerChanged,以及可能的OnPaint方法。
請注意,在我們的情況下,我們保留UI的複選標記而不是單選按鈕。但保持專有的勾號功能。
OKay,這是我的最終代碼。它做另一個不支持(支持綁定)的東西,反之亦然。也許可以合併。盡情享用。
// 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);
}
}
}
}