看看这个非常简单的WPF程序示例:
所以我有一个GroupBox,其标题是一个CheckBox.我们都做过类似的事情 - 通常你绑定GroupBox的内容,以便在取消选中CheckBox时禁用它.
但是,当我运行此应用程序并单击CheckBox时,我发现有时我的鼠标点击被吞下并且CheckBox的状态不会改变.如果我是对的,那就是当我点击GroupBox顶部边框所在的确切像素行时.
有人可以复制这个吗?为什么会发生这种情况,是否有办法绕过它?
编辑:将GroupBox的BorderThickness设置为0可以解决问题,但显然它会删除边框,因此它看起来不再像GroupBox一样.
Ian Oakes回答了Tab键顺序,使得标题出现在内容之后.可以修改控件模板,使边框无法获得焦点.
要执行此操作,请修改模板,以便第2和第3个边框(均在网格行1中)具有 IsHitTestVisible=false
完整模板如下
它似乎是GroupBox控件模板中的一个微妙错误.我发现通过编辑GroupBox的默认模板并将名为'Header'的Border移动到控件模板Grid元素中的最后一项,问题自行解决.
原因是带有BorderBrush的TemplateBinding的其他Border元素之一在可视化树中进一步向下并捕获鼠标单击,这就是将BorderBrush设置为null允许CheckBox正确接收鼠标单击的原因.
下面是GroupBox的结果样式.它几乎与控件的默认模板相同,但名为"Header"的Border元素除外,它现在是Grid的最后一个子节点,而不是第二个子节点.
我做的另一个解决方案是在派生的GroupBox中实现OnApplyTemplate:
public override void OnApplyTemplate() { base.OnApplyTemplate(); if (Children.Count == 0) return; var grid = GetVisualChild(0) as Grid; if (grid != null && grid.Children.Count > 3) { var bd = grid.Children[3] as Border; if (bd != null) { bd.IsHitTestVisible = false; } } }