2010-06-03 19 views

Antwort

3

Sie könnten versuchen, aus ComboBox und Zugriff auf die interne TextBox abgeleitet, wie folgt aus:

public class MyComboBox : ComboBox 
{ 
    TextBox _textBox; 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     _textBox = Template.FindName("PART_EditableTextBox", this) as TextBox; 
     if (_textBox != null) 
     { 
      _textBox.GotKeyboardFocus += _textBox_GotFocus; 
      this.Unloaded += MyComboBox_Unloaded; 
     } 
    } 

    void MyComboBox_Unloaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     _textBox.GotKeyboardFocus -= _textBox_GotFocus; 
     this.Unloaded -= MyComboBox_Unloaded; 
    } 

    void _textBox_GotFocus(object sender, System.Windows.RoutedEventArgs e) 
    { 
     _textBox.Select(_textBox.Text.Length, 0); // set caret to end of text 
    } 

} 

In Ihrem Code Sie es wie folgt verwenden würde:

<Window x:Class="EditableCbox.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:EditableCbox" 
    Title="Window1" Height="300" Width="300"> 
    ... 
     <local:MyComboBox x:Name="myComboBox" IsEditable="True" Grid.Row="0" Margin="4"> 
      <ComboBoxItem>Alpha</ComboBoxItem> 
      <ComboBoxItem>Beta</ComboBoxItem> 
      <ComboBoxItem>Gamma</ComboBoxItem> 
     </local:MyComboBox> 
    ... 
</Window> 

Diese Lösung leicht gefährlich, aber, In zukünftigen Versionen von WPF könnte Microsoft möglicherweise auch einen GotKeyboardFocus-Ereignishandler (oder ähnliche Ereignishandler) hinzufügen, der in Konflikt mit dem Ereignishandler in MyComboBox geraten könnte.

9

können Sie diesen Code versuchen:

 var textBox = (comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox); 
     if (textBox != null) 
     { 
      textBox.Focus(); 
      textBox.SelectionStart = textBox.Text.Length; 
     } 
+1

kein Code, der hier zitiert wird, funktioniert. –

+2

@RAJK Dieser Code funktionierte perfekt für mich. Es löst das Problem, den Fokus auf ein editierbares Kombinationsfeld zu legen, wenn ein Fenster zum ersten Mal angezeigt wird. Was nicht deutlich gesagt wird, ist, dass Sie den Code in das Loaded-Ereignis des Fensters einfügen müssen, das die bearbeitbare Combobox enthält. –

+0

Perfekt! Hat mir viele und viele Probleme gelöst! Ich danke dir sehr! –

3

Basierend auf der Antwort von user128300 oben ich mit einer etwas einfacheren Lösung kam. Im Konstruktor oder ContextChangedHandler der Code für die Steuerung wartet, bevor setzen den Fokus auf das UI-Element zu ladende

myComboBox.GotFocus += MyComboBoxGotFocus; 
myComboBox.Loaded += (o, args) => { myComboBox.Focus(); }; 

Dann im Fokus auch Handler ich den ganzen Text von Anfang bis zum Ende wählen

private void MyComboBoxGotFocus(object sender, RoutedEventArgs e) 
{ 
    var textBox = myComboBox.Template.FindName("PART_EditableTextBox", myComboBox) as TextBox; 
    if (textBox != null) 
     textBox.Select(0, textBox.Text.Length); 
} 

In XAML ist die Combobox editierbar. Durch den gesamten Text markieren, wenn der Benutzer einen Schlüssel geben Sie den vorherigen Wert zurücksetzt

<ComboBox x:Name="myComboBox" IsEditable="True" /> 
0

Basierend auf Rikker Serg Antwort, können Sie diesen Code in Ihrem Konstruktor (nach InitializeComponent) und versenden sie statt der Notwendigkeit Gewohnheit zu erstellen Steuerelemente oder Ereignishandler.

public NewMessageWindow() 
{ 
    InitializeComponent(); 

    Dispatcher.BeginInvoke(new Action(() => 
    { 
     var textBox = myComboBox.Template.FindName("PART_EditableTextBox", cbUsers) as TextBox; 
     if (textBox != null) 
     { 
      textBox.Focus(); 
      textBox.SelectionStart = textBox.Text.Length; 
     } 
    })); 

} 
Verwandte Themen