您可以嘗試使用TopIndex
設置頂部可見指數是這樣的:
您也可以嘗試定義一些方法來選擇設置指標的收集和使用BeginUpdate
和EndUpdate
避免閃爍:
public static class ListBoxExtension {
public static void SetMultiSelectedWithoutJumping(this ListBox lb, IEnumerable<int> indices, bool selected){
int i = lb.TopIndex;
lb.BeginUpdate();
foreach(var index in indices)
lb.SetSelected(index, selected);
lb.TopIndex = i;
lb.EndUpdate();
}
}
//usage
yourListBox.SetMultiSelectedWithoutJumping(new List<int>{2,3,4}, true);
注意:您還可以使用BeginUpdate
和EndUpdate
在SetSelectedWithoutJumping
,但正如我所說,如果你必須一起選擇多指標,實施一些擴展方法,如SetMultiSelectedWithoutJumping
更好,更方便(我們只使用1對BeginUpdate
和EndUpdate
)。
我都掛起/恢復外觀,還採用的BeginUpdate/endupdate但閃爍的是不是我的問題,謝謝你的答案我不不知道Topindex屬性,至少現在列表框已經回到了前一個位置,但是仍然在移動(當listbox包含很多項目時,它可以被更多地理解),所以現在Listbox正在跳轉,但是在跳轉之後它返回到之前的位置,我希望如果存在一種方法來禁止這種運動,而不是試圖做一些棘手的事情(跳到那裏並返回),真的非常感謝! – ElektroStudios
@ElektroStudios **這不是棘手的**,這是應該如何做。當你調用'SetSelected'時,原生'LB_SETSEL'總是具有類似的行爲(跳到選定的項),實際上'LB_SETSEL'消息被髮送。所以你沒有任何所謂的「直路」。 'BeginUpdate'和'EndUpdate'是爲了解決這個問題而設計的。當你不需要的時候抑制每一個繪圖,只需調用'EndUpdate'來接受當前的'UI狀態'。 –
現在它已經解決了,你的擴展可以和beginupdate/endupdate一起完美地完成工作,它不會產生任何噁心的視覺效果(我的意思是跳躍),很好的回答! – ElektroStudios