У нас есть некоторый код, который использует .net Windows.Forms.TreeView. Когда элемент в представлении выбран, тогда код делает
treeView.BeginUpdate();
// ... some stuff ...
SendMessage(treeView.Handle, WM_HSCROLL, SB_LEFT, 0);
treeView.EndUpdate();
Это так, что древовидное представление не прокручивается вправо (что является поведением по умолчанию - чтобы отображать как можно большую метку выбранного элемента, как я полагаю, но за счет скрытия части древовидной структуры). К сожалению, когда древовидное представление содержит 30 000 элементов, и этот код вызывается во время щелчка правой кнопкой мыши, и в результате контекстное меню отображается в течение нескольких секунд (этого достаточно, чтобы сбить с толку).
Если вы удалите Begin / EndUpdate, то контекстное меню появится мгновенно, но вы получите раздражающий подергивание, когда вы увидите, что вид перемещается вправо, а затем назад к левому краю. Предложение избавиться от свитка «толкни его назад к левому краю» встречает некоторое сопротивление.
Я попытался отфильтровать SB_RIGHT в древовидном представлении, но, похоже, к нему не привыкли, когда элемент управления перемещается для отображения метки.
Так есть ли способ сохранить вид дерева в его текущей горизонтальной позиции прокрутки, когда выбран элемент, который не включает Begin / EndUpdate и соответствующее запаздывание или подергивание?