我想创建看起来像标准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”然后单击外部弹出窗口未关闭。问题是如何解决这个问题?
答案 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;
}
}
}