Как избавиться от эффекта выделения подсветки checklistbox?

Когда элемент щелкнут в списке отметок, он подсвечивается. Как я могу предотвратить этот эффект выделения?

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

5 ответов

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

this.checkedListBox1.SelectionMode = System.Windows.Forms.SelectionMode.None;

хотя теперь вы не можете нажать на флажки... так что вам нужно будет сделать что-то вроде этого:

private void checkedListBox1_Click(object sender, EventArgs e)
 {
 for (int i = 0; i < checkedListBox1.Items.Count; i++)
 {
 if (checkedListBox1.GetItemRectangle(i).Contains(checkedListBox1.PointToClient(MousePosition)))
 {
 switch (checkedListBox1.GetItemCheckState(i))
 {
 case CheckState.Checked:
 checkedListBox1.SetItemCheckState(i, CheckState.Unchecked);
 break;
 case CheckState.Indeterminate:
 case CheckState.Unchecked:
 checkedListBox1.SetItemCheckState(i, CheckState.Checked);
 break;
 } 
 }
 }
 }

Если все это не то, что вы после.. вы всегда можете просто сделать свой собственный. его довольно простой контроль.


Используйте следующее:

private void checkedListBox1__SelectedIndexChanged(object sender, EventArgs e)
 {
 checkedListBox1.ClearSelected();
 }


Настройка SelectionMode на None имеет некоторые странные проблемы, такие как необходимость выполнения события Click. Вы можете оставить набор SelectionMode единым, а затем создать класс, который переопределяет CheckedListBox с помощью только OnDrawItem. Обратите внимание: чтобы отключить выбранный внешний вид, вы должны отключить состояние "Выбранное" и установить цвета в соответствии с тем, что вы хотите. Вы можете получить исходный цвет из элемента управления, как я здесь. Это то, к чему я придумал, и должен заставить вас начать делать его, как вы хотите.

public partial class EnhancedCheckedListBox : CheckedListBox
{
 /// <summary>Overrides the OnDrawItem for the CheckedListBox so that we can customize how the items are drawn.</summary>
 /// The System.Windows.Forms.DrawItemEventArgs object with the details
 /// <remarks>A CheckedListBox can only have one item selected at a time and it always the item in focus.
 /// So, don't draw an item as selected since the selection colors are hideous. 
 /// Just use the focus rect to indicate the selected item.</remarks>
 protected override void OnDrawItem(DrawItemEventArgs e)
 {
 Color foreColor = this.ForeColor;
 Color backColor = this.BackColor;
 DrawItemState s2 = e.State;
 //If the item is in focus, then it should always have the focus rect.
 //Sometimes it comes in with Focus and NoFocusRect.
 //This is annoying and the user can't tell where their focus is, so give it the rect.
 if ((s2 & DrawItemState.Focus) == DrawItemState.Focus)
 {
 s2 &= ~DrawItemState.NoFocusRect;
 }
 //Turn off the selected state. Note that the color has to be overridden as well, but I just did that for all drawing since I want them to match.
 if ((s2 & DrawItemState.Selected) == DrawItemState.Selected)
 {
 s2 &= ~DrawItemState.Selected;
 }
 //Console.WriteLine("Draw " + e.Bounds + e.State + " --> " + s2);
 //Compile the new drawing args and let the base draw the item.
 DrawItemEventArgs e2 = new DrawItemEventArgs(e.Graphics, e.Font, e.Bounds, e.Index, s2, foreColor, backColor);
 base.OnDrawItem(e2);
 }
}


Я немного опоздал, чтобы дать ответ здесь. В любом случае, это будет снять флажки всех и удалить эффект выделения:

foreach (int i in clb.CheckedIndices) //clb is your checkListBox
 clb.SetItemCheckState(i, CheckState.Unchecked);
clb.SelectionMode = System.Windows.Forms.SelectionMode.None;
clb.SelectionMode = System.Windows.Forms.SelectionMode.One;
  • Снимите все флажки
  • Отключить выбор checkListBox
  • Включить выбор checkListBox


ooh cool добавить поместите весь код из ответа от Hath в

checkedListBox1_MouseMove(object sender, MouseEventArgs e)

добавить, если кнопка мыши вставляется в переключатель

case CheckState.Checked:
 if (e.Button == MouseButtons.Right)
 {
 checkedListBox1.SetItemCheckState(i, CheckState.Unchecked);
 } 
 break;

и

case CheckState.Unchecked:
 if (e.Button == MouseButtons.Left)
 {
 checkedListBox1.SetItemCheckState(i, CheckState.Checked);
 }
 break;

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

licensed under cc by-sa 3.0 with attribution.