【问题标题】:WPF combobox-like custom controlWPF 组合框式自定义控件
【发布时间】:2011-02-16 14:36:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • @RQDQ:你到底需要什么?控制模板?正如我所说,它与默认组合框模板相同,但没有 ItemsPresenter,而是有一个其他控件。
  • 我们想看看您已经拥有什么,这样我们就不必为了帮助您而重新发明轮子。
  • @RQDQ - 我用示例项目的链接和其他问题更新了我的原始帖子。

标签: wpf combobox wpf-controls popup


【解决方案1】:

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

【讨论】:

  • 当弹出窗口显示并且您在其外部单击时不会触发此事件。
【解决方案2】:

这段代码解决了问题。

在静态构造器中:

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 的含义以及使其工作所需的所有步骤吗?
  • 链接的文件不再存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多