如何在WPF可编辑组合框中设置插入符位置

13

我搜索了类似的问题,但没有找到任何有用的信息。Caret 似乎不可用,并且我不知道如何深入到嵌入在组合框中的文本框或其他控件。

2个回答

12

您需要从组合框的控件模板中获取 PART_EditableTextBox 控件。最简单的方法是通过派生自ComboBox 的类,覆盖OnApplyTemplate 方法,然后在需要具有此扩展行为的地方使用该派生类作为组合框。

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

在获得文本框之后,您可以设置插入符号位置,将SelectionStart设置为您想要插入符号出现的位置,并将SelectionLength设置为零。

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

1
我做了类似的事情以使其工作,所以感谢你的帮助! 如果您能稍微整理一下您的答案,使未来查看的人更容易理解就更好了。需要在函数上使用void返回类型,并提到您必须创建一个新类来派生自原始类,并在其中添加一个editableTextBox属性。 谢谢Jeff。 - DrLazer
@DrLazer:我已经添加了 void,但它已经提到需要派生一个类。谢谢。 - Jeff Yates
@DrLazer:谢谢。句子中已经说明了:“...在 ComboBox派生类中重写 OnApplyTemplate,然后在需要具有此扩展行为的任何地方使用该派生类的组合框。” - Jeff Yates
1
我建议包括base.OnApplyTemplate()这一行。没有它,我曾经遇到过奇怪的行为。 - Aleksey
不再需要使用 GetTemplateChild 获取 "PART_EditableTextBox" 元素。在后续的 .NET 版本中,SelectionStartSelectionLength 成员可以直接进行编辑。 - Jim Fell

7

如果不想处理派生类,只是想为任意ComboBox设置插入符号,则更简单的方法是,在需要时从模板中获取文本框(类似于接受的答案),然后直接更新插入符号位置。

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

这应该很容易转换为扩展方法,以便在任何组合框上调用。 - Nkosi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接