当前位置:  开发笔记 > Android > 正文

WPF中的GroupBox标头是否吞下鼠标单击?

如何解决《WPF中的GroupBox标头是否吞下鼠标单击?》经验,为你挑选了3个好方法。

看看这个非常简单的WPF程序示例:



    
        
            
        
    

所以我有一个GroupBox,其标题是一个CheckBox.我们都做过类似的事情 - 通常你绑定GroupBox的内容,以便在取消选中CheckBox时禁用它.

但是,当我运行此应用程序并单击CheckBox时,我发现有时我的鼠标点击被吞下并且CheckBox的状态不会改变.如果我是对的,那就是当我点击GroupBox顶部边框所在的确切像素行时.

有人可以复制这个吗?为什么会发生这种情况,是否有办法绕过它?

编辑:将GroupBox的BorderThickness设置为0可以解决问题,但显然它会删除边框,因此它看起来不再像GroupBox一样.



1> Ray..:

Ian Oakes回答了Tab键顺序,使得标题出现在内容之后.可以修改控件模板,使边框无法获得焦点.

要执行此操作,请修改模板,以便第2和第3个边框(均在网格行1中)具有 IsHitTestVisible=false

完整模板如下






2> Ian Oakes..:

它似乎是GroupBox控件模板中的一个微妙错误.我发现通过编辑GroupBox的默认模板并将名为'Header'的Border移动到控件模板Grid元素中的最后一项,问题自行解决.

原因是带有BorderBrush的TemplateBinding的其他Border元素之一在可视化树中进一步向下并捕获鼠标单击,这就是将BorderBrush设置为null允许CheckBox正确接收鼠标单击的原因.

下面是GroupBox的结果样式.它几乎与控件的默认模板相同,但名为"Header"的Border元素除外,它现在是Grid的最后一个子节点,而不是第二个子节点.






3> Rune Anderse..:

我做的另一个解决方案是在派生的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;
    }
  }
}

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有