描述:我需要获取对位于 ComboBox 内的 TextBox 的引用,以便控制该特定元素的 GotFocus 和 LostFocus 事件,因为我对整个 ComboBox 的焦点不感兴趣。
首先,我通过创建一个 UserControl 实现了预期的结果,在该 UserControl 中我收到了一个指向 TextBox 的链接,使用:
comboBox.Template.FindName("PART_EditableTextBox", comboBox)
在 UserControl 中一切正常。
之后我决定制作自己的 CustomControl。我想获得现有的 ComboBox 功能并添加我自己的逻辑。为此,我创建了
public abstract class MeasureComboBox<InstanceT, EnumT> : ComboBox
{
// ...
}
在这个抽象类的构造函数中,我想再次使用 Template.FindName() 来获取对 TextBox 的引用,但是这次这个方法返回了 null。这是我使用此方法的构造函数代码:
public MeasureComboBox()
{
this.TextBox = this.Template.FindName("PART_EditableTextBox", this) as TextBox;
this.TextBox.GotFocus += TextBox_GotFocus;
this.TextBox.LostFocus += TextBox_LostFocus;
}
问题:您能否评论一下为什么此方法返回 null 以及是否可以获得对 this.TextBox 的引用。
注意:创建 CustomControl 时,我需要 ComboBox 的现有逻辑和设计才能工作。由于我不打算对设计进行更改,因此我从构造函数中删除了该方法:
DefaultStyleKeyProperty.OverrideMetadata(typeof(MeasureComboBox<InstanceT, EnumT>), new FrameworkPropertyMetadata(typeof(MeasureComboBox<InstanceT, EnumT>)));
这是一个与我的问题有关的 CustomControl 的损坏示例。我尽可能地简化了课程的内容,以显示特定的问题区域。执行此代码时,字段 TextBox = null:
public class MeasureComboBox : ComboBox
{
#region FIELDS
/// <summary>
/// TextBox that bilongs to ComboBox control.
/// </summary>
private TextBox TextBox;
#endregion
static MeasureComboBox()
{
}
public MeasureComboBox()
{
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
// Почему здесь возвращается null?
this.TextBox = this.Template.FindName("PART_EditableTextBox", this) as TextBox;
}
}
将属性设置
IsEditable为true、重载OnApplyTemplate和调用Template.FindName("PART_EditableTextBox", this)。将工作。这些信息是从哪里来的?MSDN没有提到类似的东西。
让我们看看我们的组合框将具有的样式。如本答案中所述,这是最容易做到的。我们会看到类似的东西(我删除了额外的):
我们可以看到模板并没有真正的
PART_EditableTextBox. 她什么时候出现?在代码中寻找一行PART_EditableTextBox,我们发现如下:也就是说,对于 时的情况
Editable == true,选择另一个模板。我们调查一下(我再次删除了多余的部分):因此,在这种情况下
PART_EditableTextBox出现。因此,为了让您拥有正确的子控件,您必须处于编辑模式。此外,它不取决于您使用的是 stockComboBox还是 custom,因为我们正在查看的样式是由您的控件从标准样式继承的ComboBox。现在我们可以删除所有生成的样式(我们不再需要它)并将其设置
IsEditable="True"为 XAML 或代码隐藏。