簡體   English   中英

C# ComboBox 禁用突出顯示

[英]C# ComboBox disable highlighting

我有自定義 ComboBox,其中DropDownStyle = ComboBoxStyle.DropDown; 設置 .DropDown 樣式是因為我想將 ComboBox 的 Text 屬性設置為值列表之外的內容。 一切都很好,除了 ComboBox 在它離開時突出顯示文本並且當我單擊組合框時可以進行編輯。 我該如何應對? 為了顯示:

在此處輸入圖片說明

第一張圖片是一切看起來不錯的地方,第二張是高光情況,第三張編輯打開。

在 DropDown 關閉嘗試取消選擇文本:

void comboBox1_DropDownClosed(object sender, EventArgs e) {
  this.BeginInvoke(new Action(() => { comboBox1.Select(0, 0); }));
}

棘手的問題要解決。 它似乎來自Resize事件。 有很多解決方案可以做類似的事情,但在我嘗試之前,我見過的解決方案都沒有對我有用。 (這是一個不需要從ComboBox繼承的解決方案;繼承可能是一個更直接的解決方案,但要求您始終使用繼承的類,而不是實際的ComboBox類。)

comboBox.Resize += (s, e) => {
   if (!comboBox.IsHandleCreated)
      return;  // avoid possible exception

   comboBox.BeginInvoke(new Action(() => comboBox.SelectionLength = 0));
};

將選擇長度設置為零以消除高光,但是什么時候? 其他示例在其他地方也這樣做,但問題似乎是由Resize專門引起的,因此在Resize始終如一地修復它之后這樣做,至少對我而言。 (雖然當你調整窗口大小時仍然可以看到它閃爍,但它總是結束。)

BeginInvoke確保它在Resize后充分發生才能工作,並且檢查IsHandleCreated可防止在創建句柄之前調用它,在這種情況下, BeginInvoke將引發異常。

這個稍微復雜的版本包括一些檢查,以防止焦點控件丟失高亮,因為它實際上應該擁有它。 如果父級還不存在,或者父級還沒有活動控件,它也不會觸發,這兩種跡象都表明事情還為時過早。

comboBox.Resize += (s, e) => {
   if (!comboBox.IsHandleCreated)
      return;

   comboBox.BeginInvoke(new Action(() => {
      var parent = comboBox.FindForm();
      if (parent == null)
         return;

      if (parent.ActiveControl == null)
         return;

      if (parent.ActiveControl == comboBox)
         return;

      comboBox.SelectionLength = 0;
   }));
};

我試圖制作一個可以“保留”選擇長度而不是始終將其設置為零的版本,但我無法使其正確同步。 許多Resize事件可以在BeginInvoke委托開始觸發之前觸發,因此保留的值將始終被損壞的值覆蓋。 我嘗試將它們全部保存在QueueStack ,但在這兩種情況下,我都無法顛倒順序(不確定為什么,因為這沒有意義)。

如果您指的是禁用突出顯示和編輯,那么您可能需要考慮將DropdownStyle屬性設置為DropdownList

yourComboBox.DropDownStyle = ComboBoxStyle.DropDownList;

為了解決同樣的問題,我幾乎嘗試了所有方法:

  • DropdownStyle屬性設置為DropdownList
  • this.BeginInvoke(new Action(() => { comboBox1.Select(0, 0); }));
  • combobox1.SelectionLength = 0;
  • 改變comboBox.TabIndex
  • 沒試過SendKeys.Send("{ESC}"); 因為它不是一個可靠的解決方案

沒有任何幫助。 唯一穩定且有效的解決方案是將焦點轉移到另一個 Label 控件上:

    label.Focus();

您也可以隱藏該標簽。

我知道這篇文章很舊,但最近我在組合框上遇到了同樣的問題。

情況:我有一個可編輯的組合框,當用戶寫一些字母時,它會建議完整的單詞。

但是當我想輸入一個字母時,組合框會自動突出顯示文本,下一個字母會自動替換上一個。

解決方案:我使用文本框來避免任何類似的突出顯示:

<ComboBox IsTextSearchEnabled="False" IsEditable="True" x:Name="CMB_ClientName"/>
<TextBox Text="{Binding ElementName=CMB_ClientName, Path=Text}" TextChanged="ComboBoxChange" x:Name="TXT_ClientName"/>

我生成了文本框 TextChanged 事件:

private void ComboBoxChange(object sender, TextChangedEventArgs e)
    {
        //Clear ComboBox items
        CMB_ClientName.Items.Clear();
        //Auto Open DropDownList
        CMB_ClientName.IsDropDownOpen = true;

        //Get data from database (use entity framework 6.x)
        dbEntity.Client.Load();

        //Attribute Data to variable
        var clients = dbEntity.Client.Local;


        foreach (Client client in clients)
        {
            //If data begin with the texbox text, the data is add to the combobox items list.
            if (client.Nom.ToLower().StartsWith(TXT_NomClient.Text.ToLower()))
            {
                CMB_ClientName.Items.Add(client.Nom);
            }
        }
    }

我知道這個解決方案不是很漂亮,但對我來說它是避免突出顯示文本的最簡單的解決方案,並且這篇文章中的所有解決方案對我都不起作用。

我希望這個解決方案會有所幫助,感謝閱讀。

數學。

Ps:抱歉,我的英文不是很好。 我希望你能正確理解我。

在我將組合框屬性 TabStop 設置為 false 之前,沒有什么對我有用(我希望表單在任何組合框中都沒有突出顯示)。 這意味着我的一個按鈕采用了我不喜歡的選項卡突出顯示,因此我將它們全部設置為 false 以啟動並根據需要以編程方式調整它們。

我知道這是一個舊線程,但我的解決方案與其他解決方案類似,但依賴於 Form.ResizeEnd 事件。 在其事件處理程序中,我遍歷 ComboBoxes 並將 ComboBox.SelectionLength 設置為 0。

private void Form_ResizeEnd(object sender, EventArgs e)
{
    foreach(ComboBox comboBox in parentControl.Controls.OfType<ComboBox>
    {
        comboBox.SelectionLength = 0;
    }
}

這對我有用:

  1. 將 DrawMode 設置為 OwnerDrawFixed

  2. 將 cbxSubsystems.DrawItem 事件設置為下面的函數

private void cbxSubsystems_DrawItem(object sender, DrawItemEventArgs e)
{
    Color BgClr;
    Color TxClr;

    if( (e.State & DrawItemState.ComboBoxEdit) == DrawItemState.ComboBoxEdit )
    {
        // Do not highlight main display
        BgClr = cbxSubsystems.BackColor;
        TxClr = cbxSubsystems.ForeColor;
    }
    else
    {
        BgClr = e.BackColor;
        TxClr = e.ForeColor;
    }

    e.Graphics.FillRectangle(new SolidBrush(BgClr), e.Bounds);

    TextRenderer.DrawText(e.Graphics, cbxSubsystems.Items[e.Index].ToString(), e.Font, e.Bounds,
        TxClr, BgClr, TextFormatFlags.Left | TextFormatFlags.VerticalCenter );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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