2015-06-12 71 views
6

我已經得到如何在TextBox上單擊時選擇所有文本;我想爲可編輯的組合框執行相同的操作 - 找到任何東西。我的TextBox代碼是WPF可編輯ComboBox SelectAll單擊時

private void OnPreviewMouseDown(Object sender, MouseButtonEventArgs e) 
{ 
    txtBox.SelectAll(); 
    txtBox.Focus(); 
    e.Handled = true; 
} 

對於可編輯組合框,同樣可以做什麼?

更新 代碼COMBOX,讓我說,我想要的輸出:

private void cboMouseDown(object sender, MouseButtonEventArgs e) 
     { 
      var textBox = (cbo.Template.FindName("PART_EditableTextBox", cbo) as TextBox); 
      if (textBox != null) 
      { 
       textBox.SelectAll(); 
       cbo.Focus(); 
       e.Handled = true; 
      } 
     } 

但是現在的組合框的下拉不起作用,任何建議?

更新-2:而不是PreviewMouseDown - 我試過了PreviewMouseUp,現在下拉菜單確實出現了;但是一旦點擊了該框,然後嘗試打開下拉菜單 - 窗口就會凍結。 不過,我已經做了一個工作,我已經把我的答案放在下面。我真的很感激你的意見,但如果這是一個正確的和安全的解決方案,我可以一起去。這樣

var comboTextBoxChild = comboBox.FindChild(typeof(TextBox), "PART_EditableTextBox") as TextBox; 

    comboTextBoxChild .SelectAll(); 

+0

做一次你爲什麼不使用'Focus'事件(在兩個控件上)?鼠標事件在所有情況下都不起作用(鍵盤導航,觸摸...)。 – ChrFin

+0

在GotFocus上默認選擇了文字。我的要求是輸入一些字符後,如果用戶點擊他鍵入的內容 - 整個文本被選中,以便他可以重新開始。默認行爲雖然是當你第一次點擊整個文本被選中,但在下一次單擊時,光標會轉到您單擊的位置,並且文本保持未選中狀態。 – marifrahman

+1

**只是檢查出這些鏈接 - ** [選擇組合框的文本] [1] [如何將焦點添加到WPF可編輯ComboBox] [2] [1]:HTTP:// stackoverflow.com/q/19728650/2025489 [2]:http://stackoverflow.com/a/2964222/2025489 – LogicalDesk

回答

5

使用GotFocus事件,並選擇文本這裏組合框是你的編輯ComboBox名

+0

如果我在Combobox的PreviewMouseDown上執行此操作,我可以得到我想要的 - 但問題是下拉列表無法打開。 – marifrahman

3

一個可能的解決辦法,我已經得到了它的工作對我來說 - 需要一些建議,但如果它是確定或不;我使用PreviewMouseUp事件ComboBox的:

private void cboMouseUp(object sender, MouseButtonEventArgs e) 
     { 
      var textBox = (cbo.Template.FindName("PART_EditableTextBox", cbo) as TextBox); 
      if (textBox != null && !cbo.IsDropDownOpen) 
      { 
       Application.Current.Dispatcher.BeginInvoke(new Action(()=>{ 
        textBox.SelectAll(); 
        textBox.Focus(); 
        //e.Handled = true; 
       })); 
      } 
1

我有點晚聚會,但最近,我有同樣的問題,測試了多種解決方案後,我想到了我自己的(我創建了這個目的自定義控件) :

public class ComboBoxAutoSelect : ComboBox 
{ 
    private TextBoxBase textBox; 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     textBox = GetTemplateChild("PART_EditableTextBox") as TextBoxBase; 
    } 

    protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e) 
    { 
     // if event is called from ComboBox itself and not from any of underlying controls 
     // and if textBox is defined in control template 
     if (e.OriginalSource == e.Source && textBox != null) 
     { 
      textBox.Focus(); 
      textBox.SelectAll(); 
      e.Handled = true; 
     } 
     else 
     { 
      base.OnPreviewGotKeyboardFocus(e); 
     } 
    } 
} 

,你可以做同樣的事件,但你需要搜索「PART_EditableTextBox」每次都在這裏,我們每個模板變化