wpf - 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”。
我们做错了什么?
谢谢 -
解决方案
如果要在派生类中检索控件的一部分,则应使用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;
}
}
}
我希望它可以帮助你。
推荐阅读
- python-3.x - len() 函数没有给出正确的字符数
- python - 如何使用屏幕并包含命令行标志
- java - groovy.lang.MissingMethodException:没有方法签名:java.util.ArrayList
- google-drive-api - 如何在 Google Drive 上禁止/解决递归权限?
- ios - 在 Swift 4 中,如何创建明亮/闪亮/发光的视图?
- python - lstm 自动编码器时间序列数据输入形状
- swift - Swift - 字符串的最后一个索引
- python - 使用 docker python API 在特定 IP 上运行容器
- java - 我的程序在模拟器上运行良好,但在手机上崩溃
- jung - 在 JUNG 中创建双向箭头