void SelectIndexCentered(int bestIndex) { if (bestIndex < 0) { listBox.ClearSelection(); } else { int firstItem = listBox.FirstVisibleItem; if (bestIndex < firstItem || firstItem + listBox.VisibleItemCount <= bestIndex) { // CenterViewOn does nothing as CompletionListBox.ScrollViewer is null listBox.CenterViewOn(bestIndex); listBox.SelectIndex(bestIndex); } else { listBox.SelectIndex(bestIndex); } } }
/// <summary> /// Selects the item that starts with the specified text. /// </summary> public void SelectItemWithStart(string startText) { if (string.IsNullOrEmpty(startText)) { return; } if (listBox == null) { ApplyTemplate(); } int selectedItem = listBox.SelectedIndex; int bestIndex = -1; int bestQuality = -1; // Qualities: 0 = match start // 1 = match start case sensitive // 2 = full match // 3 = full match case sensitive double bestPriority = 0; for (int i = 0; i < completionData.Count; ++i) { string itemText = completionData[i].Text; if (itemText.StartsWith(startText, StringComparison.OrdinalIgnoreCase)) { double priority = 0; //completionData[i].Priority; int quality; if (string.Equals(itemText, startText, StringComparison.OrdinalIgnoreCase)) { if (startText == itemText) { quality = 3; } else { quality = 2; } } else if (itemText.StartsWith(startText, StringComparison.Ordinal)) { quality = 1; } else { quality = 0; } bool useThisItem; if (bestQuality < quality) { useThisItem = true; } else { if (bestIndex == selectedItem) { useThisItem = false; } else if (i == selectedItem) { useThisItem = bestQuality == quality; } else { useThisItem = bestQuality == quality && bestPriority < priority; } } if (useThisItem) { bestIndex = i; bestPriority = priority; bestQuality = quality; } } } if (bestIndex < 0) { listBox.ClearSelection(); } else { int firstItem = listBox.FirstVisibleItem; if (bestIndex < firstItem || firstItem + listBox.VisibleItemCount <= bestIndex) { listBox.CenterViewOn(bestIndex); listBox.SelectIndex(bestIndex); } else { listBox.SelectIndex(bestIndex); } } }