首页 > 解决方案 > WPF - 如何在子类控件(组合框)中获取模板化部分

问题描述

我们正在尝试继承 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' 为空。
在调试器中,我在 cb.Template.ChildNames 中找到了名称“PART_EditableTextBox”。
我们做错了什么?
谢谢 -

标签: wpfcomboboxsubclass

解决方案


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

您可以在此处找到示例(查看“预期缺少的 FrameworkElement 对象”部分)或此处

此外,您的自定义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;
        }
    }
}

我希望它可以帮助你。


推荐阅读