簡體   English   中英

WPF組合框在首字母輸入時自動突出顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM