如何在一个被设置为false的子节点上将IsHitTestVisible设置为True?

时间:2012-08-27 19:25:47

标签: wpf layout hittest

我有一条在边框内的消息,显示在MDI客户区前面。因为它只是一条消息,所以我将它设置为IsHitTestVisible为假。为方便起见,我还在其中包含了一个按钮,因此用户只需单击按钮即可开始新图表。

但是,由于边框的IsHitTestVisible设置为False,因此会短按按钮的True值,因此用户无法点击该按钮。

那就是说,如何让一个控件对鼠标不可见,同时仍允许其中一个孩子接收鼠标事件?

以下是截图:

enter image description here

我们希望带有文本的蓝色区域被点击测试不可见,但我们希望按钮仍然可以被按下。思考? (是的,我已经知道将两个项目堆叠在一个网格中,但这与布局混淆。

3 个答案:

答案 0 :(得分:1)

AFAIK你不能。 你可以使用IsEnabledProperty,但仍然有一些解决方法。 你必须像这样创建自己的按钮:

2013年9月1日编辑:

 public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        DataContext = this;
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("hello");
    }
}

public class MyButton : Button
{
    static MyButton()
    {
        IsEnabledProperty.OverrideMetadata(typeof(MyButton),
        new UIPropertyMetadata(true,(o, args) => { },(o, value) => value));
    }
}

XAML:

<BorderIsEnabled="False">
    <wpfApplication2:MyButton Margin="61,95,88,100" Click="ButtonBase_OnClick">Open a new diagram</wpfApplication2:MyButton>
</Border>

答案 1 :(得分:1)

好的,看起来不像问题那样可以解决问题,因此看起来我们必须恢复分层方法。在这种情况下,为了补偿文本更改,您必须将按钮的垂直对齐方式设置为Bottom,并确保在边框的底部边缘或TextBlock上的底部边距上有额外的填充,以确保标签始终浮动在按钮。您可以使用相同的原则管理两侧边距/填充。

这将为我们提供我们所追求的东西,但看起来非常麻烦。同样,我希望有一些方法可以用某种方式指定IsHitTestVisible(或IsEnabled),以某种方式重新建立它们(和下面)作为行为的所有者。一个人可以做梦。在那之前......层层叠加!

答案 2 :(得分:0)

免责声明::看来它无法解决OP所存在的确切问题,但我会保留在这里,因为它可能对遇到类似问题的其他人有所帮助。

单击网格不应在网格上注册任何鼠标事件。

<Grid Background="{x:Null}">
   <Button/>
<Grid/>

编辑:当您希望显示背景时,我建议这样做:对于演示,我在边框上设置了cursor =“ hand”

<Canvas>
    <Border Height="300" Width="300" Background="Red" Cursor="Hand" IsHitTestVisible="False"/>
    <Button Content="click"/>
</Canvas>

<Grid>
    <Border  Background="Red" Cursor="Hand" IsHitTestVisible="False" />
    <Button Content="click" HorizontalAlignment="Center"/>
</Grid>

这两种情况的诀窍都是控件(按钮)不是具有IsHitTestVisible =“ False”的父级的子级,而只是与后台控件重叠