2011-10-26 113 views
2

我有他們的標題上帶有TextBox的tabItems。我使用LostFocus和MouseDoubleClick事件將文本設置爲TextBox。WPF TabItem失去焦點事件

<TabControl> 
       <TabItem Width="50"> 
        <TabItem.Header> 
         <TextBox Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/> 
        </TabItem.Header> 
       </TabItem> 
</TabControl> 

    private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     TextBox text_box = sender as TextBox; 
     if (text_box == null) { return; } 

     text_box.IsReadOnly = false; 
     text_box.SelectAll(); 
    } 

    private void TextBox_LostFocus(object sender, RoutedEventArgs e) 
    { 
     TextBox text_box = sender as TextBox; 
     if (text_box == null) { return; } 

     text_box.IsReadOnly = true; 
    } 

如果只點擊TextBox外部的TabItem標題區域或enother TabItem,就會發生LostFocus事件。 單擊標籤項目內容區域不會觸發丟失的焦點事件。

如何在用戶單擊TextBox外部的任何區域時使TextBox失去焦點?

回答

3

要失去重心,在其他的詞來獲得焦點在內部標籤的內容(目標):

目標
  1. 調焦設置爲真
  2. 目標應打測試。目標的背景不應該爲空。
  3. 將事件處理程序添加到PreviewMouseDown事件(NOTE:NOT MouseDown)以對鼠標單擊作出反應。 如果你除了3步之外,你的應用程序將只對TAB鍵作出反應。

    <TabControl> 
        <TabItem Width="50"> 
         <TabItem.Header> 
          <TextBox 
           Text="text" IsReadOnly="True" 
           LostFocus="TextBox_LostFocus" 
           MouseDoubleClick="TextBox_MouseDoubleClick"/> 
         </TabItem.Header> 
         <Border Focusable="True" Background="Transparent" PreviewMouseDown="Border_PreviewMouseDown"/> 
        </TabItem> 
    </TabControl> 
    
    
    private void Border_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
        var uiElement = sender as UIElement; 
        if (uiElement != null) uiElement.Focus(); 
    } 
    
1

失重重點,一個元素必須首先重點。也許是另一種可能是給你的元素焦點在適當的地方,當你的元素被初始化,例如:

變化

<TextBox Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/> 

<TextBox x:Name="MyTextBox" Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/> 

而且在構造函數使用的FocusManager設置聚焦元素:

... 
FocusManager.SetFocusedElement(MyTextBox.Parent, MyTextBox); 
... 

Focus Overview在MSDN上是一個很好的資源,區分鍵盤焦點和邏輯焦點也很重要!