Как установить позицию каретки в редактируемом текстовом поле WPF

Я искал аналогичный вопрос и ничего не мог найти. .Каре не нравится. и я не знаю как перейти на текстовое поле или любой контроль внедряется в комбобокс.

2 ответов


вам нужно добраться до PART_EditableTextBox управление из шаблона управления поля со списком. Самый простой способ сделать это-переопределить OnApplyTemplate вывод ComboBox а затем используйте этот вывод везде, где вам нужно поле со списком с этим расширенным поведением.

protected void override OnApplyTemplate()
{
    var myTextBox = GetTemplateChild("PART_EditableTextBox") as TextBox;
    if (myTextBox != null)
    {
        this.editableTextBox = myTextBox;
    }
}

как только у вас есть текстовое поле, вы можете установить позицию курсора, set SelectionStart к месту, где вы хотели бы каретку, чтобы появиться и установить SelectionLength к нулю.

public void SetCaret(int position)
{
    this.editableTextBox.SelectionStart = position;
    this.editableTextBox.SelectionLength = 0;
}

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

var cmbTextBox = (TextBox)myComboBox.Template.FindName("PART_EditableTextBox", myComboBox);
cmbTextBox.CaretIndex = 0;