WPF-如何在子类控件(ComboBox)中获得模板化零件

时间:2018-07-27 14:35:28

标签: wpf combobox subclass

我们正在尝试对System.Windows.Controls.ComboBox进行子类化,以实现一些自定义编辑行为。
为此,我们需要EditableTextBox。
类定义:

public class CustomComboBox : System.Windows.Controls.ComboBox

在OnLoaded()处理程序中,尝试找到该部分失败:

private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        var cb = sender as System.Windows.Controls.ComboBox;
        Debug.Assert(cb != null);

        var textBox = cb.Template.FindName("PART_EditableTextBox", cb);
        Debug.Assert(textBox != null, "How is this possible -- TextBox not found?");  

在调用FindName()之后,'textBox'为null。
在调试器中,我在cb.Template.ChildNames中找到名称“ PART_EditableTextBox”。
我们怎么了?
谢谢-

1 个答案:

答案 0 :(得分:1)

如果要在派生类中检索控件的一部分,则应使用GetTemplateChild方法。使用此方法的正确位置是在调用基本方法后,在OnApplyTemplate覆盖自定义控件的地方。

您可以找到一个示例here(请参见“ 预计缺少FrameworkElement对象”部分)或here

此外,您的自定义ComboBox必须将其属性IsEditable设置为true(否则它将使用不包含该部分的模板,您可以查看ComboBox默认使用ILSpy)。

<local:CustomComboBox IsEditable="True">

因此您的代码应为:

public class CustomComboBox : ComboBox
{
    private TextBox editableTextBox;

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        if (IsEditable)
        {
            editableTextBox = GetTemplateChild("PART_EditableTextBox") as TextBox;
        }
    }
}

希望它能对您有所帮助。