2011-02-16 52 views
2

我想创建自定义控件,它看起来像标准的WPF ComboBox,但不是弹出窗口中会有ItemsPresenter,而会有另一个自定义控件。所以,我创建了从0​​派生新类,增加了一个IsDropDownOpen财产,创造一种风格,其实是默认ComboBox风格复印件(主要思想是,Popup.IsOpenToggleButton.IsPressed属性绑定到该控件的IsDropDownOpen属性)。WPF类似combobox的自定义控件

问题是,当我单击控件外部时,Popup未关闭。

我看了看Reflector中的ComboBox类,发现ComboBox在丢失鼠标捕获时使用了一些逻辑来更新IsDropDownOpen属性。但是该代码使用了一些内部类。有没有其他方法可以确定用户是否在控制之外单击并关闭了Popup

UPD:我没有找到附加文件发布的方式,所以我上传示例项目here

有看起来像组合框自定义控制,但它有一个弹出一个TreeView。当您打开弹出窗口并在控件外部单击时,它会自动关闭,但如果您打开弹出窗口,请展开'Item2',然后在弹出窗口外部单击关闭。问题是如何解决这个问题?

+0

你可以张贴一些代码? – RQDQ 2011-02-16 15:02:39

+0

@RQDQ:你到底需要什么?控制模板?正如我所说,它与默认的组合框模板相同,但不是ItemsPresenter还有另一个控件。 – adogg 2011-02-17 07:21:13

+0

这个想法是我们想看看你已经有了什么,所以我们不必重新发明轮子来帮助你。 – RQDQ 2011-02-17 14:09:54

回答

0

这段代码解决了这个问题。

在静态构造器:

EventManager.RegisterClassHandler(typeof(CustomComboBox), Mouse.LostMouseCaptureEvent, new MouseEventHandler(OnMouseCaptureLost)); 

事件处理程序实现:

private void OnMouseCaptureLost(object sender, MouseEventArgs e) 
{ 
    if (Mouse.Captured != _container) 
    { 
     if (e.OriginalSource != _container) 
     { 
     Mouse.Capture(_container, CaptureMode.SubTree); 
     e.Handled = true; 
     } 
    } 
} 
0

Control.LostFocus事件,也许处理这就足够了。