Как изменить, какой элемент «выделен» в ListBox, не меняя выбор? - PullRequest
0 голосов
/ 06 января 2011

Как изменить, какой элемент «выделен» в ListBox? См. Следующий снимок экрана для пояснения:

Screenshot demonstrating what I mean by “outlined” item as opposed to “selected” item

Фон: Я хочу иметь стандартный список множественного выбора, который работает нормально.К сожалению, список форм Windows Forms (с SelectionMode.MultiExtended) не полностью функционален.Отсутствующая функциональность заключается в том, что она не позволяет выбирать непересекающийся набор элементов с помощью клавиш Ctrl + Arrow и Ctrl + Space.(Попробуйте в проводнике Windows посмотреть, как это должно работать.) Я пытаюсь создать подкласс ListBox и добавить эту недостающую функциональность.Для этого я намерен ответить на клавиши Ctrl + Arrow в защищенном методе OnKeyDown, но для этого мне нужно иметь возможность перемещать контур без изменения набора выбранных элементов.Как мне это сделать?

1 Ответ

2 голосов
/ 06 января 2011

Вы можете сделать это, отправив сообщение LB_SETCARETINDEX в список:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern uint SendMessage(IntPtr hWnd, uint msg, uint wParam, uint lParam);

public const uint LB_SETCARETINDEX = 0x019E;
public const uint LB_GETCARETINDEX = 0x019F;

[...]

public int OutlineIndex
{
    get
    {
        return (int) WinAPI.SendMessage(Handle, WinAPI.LB_GETCARETINDEX, 0, 0);
    }
    set
    {
        if (value < 0 || value >= Items.Count)
            throw new ArgumentException("OutlineIndex cannot be negative or greater than the size of the collection.", "value");
        WinAPI.SendMessage(Handle, WinAPI.LB_SETCARETINDEX, (uint) value, 0);

    }
}
...