2011-11-29 96 views
2

我遇到LostFocus事件時出現問題,當我點擊background.I時,它不會觸發。我閱讀了一些關於焦點邏輯和鍵盤焦點的內容,但是我找不到從控件獲取焦點的方法如果只有其中一人是像文本框TextBox LostFocus不會觸發

XAML:

<Grid Height="500" Width="500"> 
    <TextBox Height="23" Width="120" Margin="12,12,0,0" Name="textBox1" LostFocus="textBox1_LostFocus" /> 
</Grid> 

C#:

private void textBox1_LostFocus(object sender, RoutedEventArgs e) 
    { 

    } 
+0

那是什麼 「背景」:

public class TextBoxUpdateOnLostKeyboardFocusBehavior : Behavior<TextBox> { protected override void OnAttached() { if (AssociatedObject != null) { base.OnAttached(); AssociatedObject.LostKeyboardFocus += OnKeyboardLostFocus; } } protected override void OnDetaching() { if (AssociatedObject != null) { AssociatedObject.LostKeyboardFocus -= OnKeyboardLostFocus; base.OnDetaching(); } } private void OnKeyboardLostFocus(object sender, KeyboardFocusChangedEventArgs e) { var textBox = sender as TextBox; if (textBox != null && e.NewFocus == null) { // Focus on the closest focusable ancestor FrameworkElement parent = (FrameworkElement) textBox.Parent; while (parent is IInputElement && !((IInputElement) parent).Focusable) { parent = (FrameworkElement) parent.Parent; } DependencyObject scope = FocusManager.GetFocusScope(textBox); FocusManager.SetFocusedElement(scope, parent); } } } 

如下您可以將它連接到你的文本框? – Tigran

+0

任何東西在這種情況下,在窗口中的網格 – Emre

+1

嘗試設置您的文本框的背景顏色,看看它是否完全覆蓋網格。如果是這樣,順便點擊TextBox。將另一個控件添加到網格並單擊它,以便進行有效的測試。 – Tigran

回答

4

您必須使用下面的隧道連接事件:PreviewLostKeyboardFocus您textbo x

隧道:最初,調用元素樹根處的事件處理程序 。然後,路由事件沿着路徑傳播沿路由的子元素的路由,朝向作爲路由事件源(引發路由事件的元素)的節點元素。 隧道路由事件經常被用作或處理爲合成控件的一部分,使得來自複合材料部件的事件可以被故意壓制或被特定於完全控制的事件替代。在WPF中提供的輸入事件通常以實現爲隧道/冒泡對的形式實現。隧道事件也是 有時被稱爲預覽事件,因爲用於配對的命名約定爲 。

+0

嗯,我知道你有多個控件時lostFocus會在控件之間切換時觸發我試圖找到一種方法來讓LostFocus事件觸發,當我點擊背景時,如果可能的話。 – Emre

+0

@Emre你有沒有嘗試過讓「背景」焦點? – dowhilefor

+0

爲什麼當你點擊背景時,你的文本框必須失去焦點? –

0

以下行爲將解決這個問題:

<TextBox> 
    <i:Interaction.Behaviors> 
     <behaviors1:TextBoxUpdateOnLostKeyboardFocusBehavior /> 
    </i:Interaction.Behaviors>    
</TextBox> 
相關問題