Ich benutze eine bearbeitbare ComboBox in WPF, aber wenn ich versuche, Fokus von C# -Code einzustellen, ist es nur Shows Auswahl. aber ich möchte zur Bearbeitungsoption gehen (der Cursor sollte für die Benutzereingabe angezeigt werden).Hinzufügen eines Fokus zu einer bearbeitbaren ComboBox in WPF
Antwort
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.
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;
}
kein Code, der hier zitiert wird, funktioniert. –
@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. –
Perfekt! Hat mir viele und viele Probleme gelöst! Ich danke dir sehr! –
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" />
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;
}
}));
}
Könnte ein Beispiel für Ihren Code geben? PS: Ich habe dich nicht abgelehnt. – Anvaka