WPF 开始关注 Editable Combobox

WPF start focusing Editable Combobox

在 wpf 中,我有一个 IsEditable=true 的组合框。在我的 window 中,我通过 FocusManager.FocusedElement="{Binding ElementName=myComboBox}" 将焦点设置到那个组合框,但组合框根本没有聚焦。我可以检查它的 IsFocused 属性 是否正确,但它不会进入编辑模式。

使用相同的代码,如果我用文本框替换组合框,文本框将获得焦点并正常进入编辑模式。如何在可编辑组合框上实现相同的行为?

我找到了解决办法。组合框获得了焦点,但问题是它无法将焦点发送到文本框,即使它处于可编辑模式。为此,我创建了一个自定义 Combobox 控件,它继承自 Combobox 并重写 OnApplyTemplate 方法以聚焦到组合框内的文本框。在下面的示例中,我还添加了 IsEditableFocusTextBox 属性,因此我可以稍后改变此行为 on/off。

class CustomCombobox : ComboBox
{
    internal bool IsEditableFocusTextBox { get; set; }
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        if (IsFocused && IsEditable && IsEditableFocusTextBox)
        {
            TextBox myControl = (TextBox)GetTemplateChild("PART_EditableTextBox");
            if (myControl != null)
            {
                myControl.Focus();
            }
        }
    }
}

我们需要重写 OnApplyTemplate 而不是 OnGotFocus,因为一开始聚焦时,模板还没有应用,所以我们可能无法获取文本框。