Как добавить фокус к доступному для редактирования ComboBox в WPF

Я использую доступный для редактирования ComboBox в wpf, но когда я пытаюсь установить фокус из кода C#, это - только выставочный выбор. но я хочу пойти для опции редактирования (курсор должен отобразиться для ввода данных пользователем).

6
задан Rajkishor Sahu 3 June 2010 в 05:15
поделиться

2 ответа

Вы можете попробовать наследовать от ComboBox и получить доступ к внутреннему TextBox, например:

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
    }

}

В вашем коде вы бы использовали его так:

<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>

Это решение немного опасно, потому что в В будущих версиях WPF Microsoft может также решить добавить обработчик событий GotKeyboardFocus (или аналогичные обработчики событий), который может конфликтовать с обработчиком событий в MyComboBox.

3
ответ дан 8 December 2019 в 15:59
поделиться

Вы можете попробовать этот код:

        var textBox = (comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox);
        if (textBox != null)
        {
            textBox.Focus();
            textBox.SelectionStart = textBox.Text.Length;
        }
9
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: