WPF组合框式自定义控件

时间:2011-02-16 14:36:26

标签: wpf combobox wpf-controls popup

我想创建看起来像标准WPF ComboBox的自定义控件,但不是在弹出窗口中有ItemsPresenter,而是会有另一个自定义控件。所以,我创建了一个派生自System.Windows.Controls.Control的新类,添加了一个IsDropDownOpen属性并创建了一个实际上是默认ComboBox样式副本的样式(主要思想是{{1 }}和Popup.IsOpen属性绑定到控件的ToggleButton.IsPressed属性。

问题是当我点击控件外部时IsDropDownOpen没有关闭。

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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; 
      }
   }
}