2 回答

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
當(dāng)ComboBox.IsEditable設(shè)置為 時(shí)True,ComboBox內(nèi)部將焦點(diǎn)(和鍵盤焦點(diǎn))設(shè)置為編輯TextBox以使其立即可用于文本輸入。這是完全有道理的,因?yàn)閱螕艟庉嫷哪康腡extBox始終是輸入或編輯一些文本。否則,用戶必須單擊TextBox兩次才能使其獲得文本輸入的焦點(diǎn)(鍵盤焦點(diǎn))。
所以,為了防止焦點(diǎn)被竊取,作者將事件標(biāo)記MouseDown為已處理,即RoutedEventArgs.Handled設(shè)置為true。(這就是為什么大多數(shù)非預(yù)覽事件被大多數(shù)控件標(biāo)記為已處理的原因)。
TextBox此外,作者希望在第一次單擊編輯時(shí)防止插入符號移動(dòng)(以使其獲得焦點(diǎn)):如果編輯沒有鍵盤焦點(diǎn)并且下拉面板是,則PreviewMouseDown事件的RoutedEventArgs.Handled將僅設(shè)置為關(guān)閉。(這就是為什么第二次點(diǎn)擊將通過添加的事件處理程序處理)。trueTextBoxTextBox
要實(shí)現(xiàn)您期望的行為,您必須處理上的UIElement.PreviewGotKeyboardFocus事件或附加事件。Keyboard.PreviewGotKeyboardFocusComboBox
或者使用方法注冊事件處理程序UIElement.AddHandler并將handledEventsToo參數(shù)設(shè)置為true:
this.MyComboBox.AddHandler(
UIElement.PreviewMouseDownEvent,
new RoutedEventHandler(MyComboBox_PreviewMouseDown),
true);

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
我自己也遇到了同樣的問題。一個(gè)簡單而有效的解決方法是將你的包裹ComboBox在一個(gè)輕量級的中ContentPresenter,然后將你的PreviewMouseDown處理程序附加到它,如下所示:
<ContentPresenter x:Name="MyComboBoxWrapper"
PreviewMouseDown="MyComboBoxWrapper_PreviewMouseDown">
<ContentPresenter.Content>
<ComboBox x:Name="MyComboBox" />
</ContentPresenter.Content>
</ContentPresenter>
此外,由于此控件PreviewMouseDown先于事件獲取事件ComboBox,因此您不僅可以使用它在甚至看到事件之前預(yù)處理事件,還可以通過將事件 arg 的屬性設(shè)置為“true”來完全ComboBox切斷事件。ComboBoxhandled
奇跡般有效!不需要子類化或其他技巧,它只需要樹中的輕量級控件!
筆記
正如某些人可能已經(jīng)考慮的那樣,從技術(shù)上講,您可以將PreviewMouseDown事件附加到您的 的任何ComboBox祖先,但您可能必須在該處理程序中包含邏輯以確定您是否實(shí)際單擊了ComboBoxvs 其他內(nèi)容。
通過使用顯式ContentPresenter(一個(gè)難以置信的輕量級元素,它本身沒有任何呈現(xiàn)邏輯。它只是托管其他元素),您現(xiàn)在擁有一個(gè)專門用于PreviewMouseDown此控件的處理程序。另外,如果您需要四處移動(dòng)它,它會(huì)更便于攜帶,因?yàn)檫@兩個(gè)物品可以一起移動(dòng)。
- 2 回答
- 0 關(guān)注
- 305 瀏覽
添加回答
舉報(bào)