[英]WPF combobox auto highlighting on first letter input
嗨,我在WPF中有一個ComboBox
<ComboBox x:Name="Select_Food" Grid.ColumnSpan="3" Margin="10" Text="" IsEditable="True"
ItemsSource="{Binding}" KeyUp="Select_Food_KeyUp" IsTextSearchEnabled="false" />
當用戶在文本框中鍵入內容時,我從數據庫中獲取信息作為選項。 當前,一切正常,但是唯一的問題是,當我在文本框中輸入第一個字母時,如果列表中的任何項目均以該字母開頭,則該字母會自動突出顯示。 因此,任何進一步的鍵入都會覆蓋第一個字母。 這是個問題。 如何停止此初始突出顯示。 我正在嘗試實現“類似於Google搜索”的組合框。
這是代碼。 請幫忙。
// While typing this function is called on every keyup stroke
private void Select_Food_KeyUp(object sender, KeyEventArgs e)
{
try
{
SqlCeCommand command = new SqlCeCommand("SELECT FOODITEM_RS FROM FOOD WHERE FOODITEM_RS LIKE @fitem", thisConnection);
command.Parameters.AddWithValue("@fitem", "%" + Select_Food.Text + "%");
SqlCeDataAdapter da = new SqlCeDataAdapter(command);
DataSet ds = new DataSet();
thisConnection.Open();
da.Fill(ds, "FOOD");
Select_Food.ItemsSource = ds.Tables[0].DefaultView;
Select_Food.DisplayMemberPath = ds.Tables[0].Columns["FOODITEM_RS"].ToString();
}
catch (SqlCeException x)
{
MessageBox.Show(x.ToString());
}
//Open dropdown menu
Select_Food.IsDropDownOpen = true;
thisConnection.Close();
}
這就是我固定的方式-
在我的keyup事件處理程序中,我添加了以下代碼-
var textbox = (TextBox)cmbBox.Template.FindName("PART_EditableTextBox", cmbBox);
if (textbox != null && _firstKey && textbox.SelectionLength > 0)
{
textbox.Select(textbox.SelectionLength, 0);
_firstKey = false;
}
_firstKey是我添加的標志。 這樣,僅在第一次引發此事件時才取消高光,這就是問題所在。 隨后的高光(用戶最有可能清除他們鍵入的內容)是允許的,並且保持不變。
我從SelectionLength處調用Select,以便我的光標停留在用戶輸入的文本的末尾。 我通過的是長度為0的清除選擇。
達琳(Darlene)的年齡已經這么大了,對我有幫助。 但是,我進行了以下編輯:
代替:
textbox.Select(textbox.SelectionLength, 0);
我用了:
textbox.Select(1, textbox.SelectionLength);
也許它是更新的ComboBox功能,但是第一個匹配項的整個文本都輸入到文本框中。 因此,將光標放在輸入的文本的末尾不允許用戶繼續輸入。 此更改使非用戶輸入的文本保持突出顯示狀態,並在用戶鍵入時替換其他字符。 直到他們鍵入不在列表中的內容,然后消失。
我們通過將IsDropDownOpen = true
preKeyDown
事件來解決此問題。 這是因為每當DropDown打開時,組合框的行為都會被選擇為文本
最近,我在WPF中實現自定義組合框時偶然發現了這種行為。 以前的hacks /解決方案都不適合我。 如果用戶鍵入的速度非常快,則仍會發生相同的行為,並且第一個字符將從文本框中刪除。 我應用的解決方案只是覆蓋事件OnDropDownOpened並將技巧與選擇一起放入該事件中。
protected override void OnDropDownOpened(EventArgs e)
{
var textBox = Keyboard.FocusedElement as TextBox;
if (textBox != null && textBox.Text.Length == 1 && textBox.SelectionLength == 1)
{
textBox.SelectionLength = 0;
textBox.SelectionStart = 1;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.