WPF类似下拉框的自定义控件

3
我想创建一个自定义控件,它看起来像标准的WPF ComboBox,但是在弹出窗口中,而不是使用ItemsPresenter,将使用另一个自定义控件。因此,我创建了一个新类,该类派生自System.Windows.Controls.Control,并添加了一个IsDropDownOpen属性,并创建了一个样式,实际上是默认ComboBox样式的副本(主要思想是Popup.IsOpen和ToggleButton.IsPressed属性绑定到控件的IsDropDownOpen属性)。问题是,当我在控件外单击时,Popup没有关闭。我查看了Reflector中的ComboBox类,并发现ComboBox使用一些逻辑来在失去鼠标捕获时更新IsDropDownOpen属性。但是,那段代码使用了一些内部类。是否有任何替代方法来确定用户是否单击了控件外部并关闭Popup?

更新:我没有找到在帖子中附加文件的方法,所以我在这里上传了示例项目。

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


@RQDQ:您需要什么?控件模板?就像我说的,它与默认组合框模板相同,但是除了ItemsPresenter之外还有其他控件。 - adogg
我们的想法是要看看你已经拥有什么,这样我们就不必重新发明轮子来帮助你。 - RQDQ
@RQDQ - 我更新了原帖并附上了示例项目的链接和额外的问题。 - adogg
2个回答

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; 
      }
   }
}

你能解释一下 _container 是什么意思,以及从开始到让它工作的所有步骤吗? - Itai Bar-Haim
链接的文件已不存在。 - Itai Bar-Haim

0

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


当弹出窗口显示并且您在其外部单击时,此事件不会触发。 - adogg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接