[英]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
委托開始觸發之前觸發,因此保留的值將始終被損壞的值覆蓋。 我嘗試將它們全部保存在Queue
或Stack
,但在這兩種情況下,我都無法顛倒順序(不確定為什么,因為這沒有意義)。
如果您指的是禁用突出顯示和編輯,那么您可能需要考慮將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;
}
}
這對我有用:
將 DrawMode 設置為 OwnerDrawFixed
將 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.