具有搜索支持的WPF自定义项控件

时间:2010-01-26 09:56:55

标签: wpf combobox custom-controls selector

我需要编写一个自定义WPF控件,该控件应该看起来像带有扩展项搜索功能的ComboBox。为此,我希望TextBoxPopup包含搜索TextBoxListBox

我的第一个问题是,从Selector继承,或者更确切地说ComboBox是否是一个好的决定?

第二个问题是我在哪里可以找到一个很好的例子......唯一的解决方案似乎是拆解微软的库并大致看看他们在做什么。

其他问题:

  1. 我应该如何处理事件?例如Button点击Template。我应该在Template中查找并以这种方式注册事件,还是可以直接在XAML中注册它,如Click="PART_Button1CLick"
  2. 谢谢你们!

2 个答案:

答案 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();
}

}