我需要编写一个自定义WPF控件,该控件应该看起来像带有扩展项搜索功能的ComboBox
。为此,我希望TextBox
和Popup
包含搜索TextBox
和ListBox
。
我的第一个问题是,从Selector
继承,或者更确切地说ComboBox
是否是一个好的决定?
第二个问题是我在哪里可以找到一个很好的例子......唯一的解决方案似乎是拆解微软的库并大致看看他们在做什么。
其他问题:
Button
点击Template
。我应该在Template
中查找并以这种方式注册事件,还是可以直接在XAML中注册它,如Click="PART_Button1CLick"
?谢谢你们!
答案 0 :(得分:0)
我认为你走在正确的轨道上。您可以在TextBox上有一个TextChanged事件,并且在文本更改后,如果至少有3个字符,则使用结果列表框生成弹出窗口,并且列表框的SelectionChanged事件设置为设置TextBox的文本和杀死它的父弹出窗口。您应该检查是否已经创建了一个弹出窗口,如果有新角色,则将其杀死。您甚至可以将弹出窗口的产生放在计时器上,因此如果他们快速键入五个字符,您只需创建一个弹出窗口停机时间的第二次(避免两个无关的弹出窗口)。
我不知道一个很好的例子,但我已经做了类似的事情(可能就是这个,我不记得了),而且它确实不会那么困难。
唯一令我困惑的是当你说:
为此,我想要一个 TextBox和带有搜索的Popup TextBox和ListBox。
我不明白那里的第二个TextBox。你应该只需要第一个。
答案 1 :(得分:0)
好的这就是我所做的:
Themes / Generic.XAML中的XAML ControlTemplate :
<Style TargetType="{x:Type local:MyControl}">
<Setter Property="Template">
...
</Setter>
</Style>
控制自己:
[TemplatePart(Name = MyControl.partSelectedTextBox, Type = typeof(TextBox))]
public class MyControl : Selector
{
public override void OnApplyTemplate()
{
...
if (_txtSelected == null)
{
_txtSelected = base.GetTemplateChild(partSelectedTextBox) as TextBox;
if (_txtSelected != null)
{
_txtSelected.MouseLeftButtonUp += new MouseButtonEventHandler(PART_txtSelected_MouseLeftButtonUp);
}
}
...
base.ApplyTemplate();
}
}