11

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

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

也就是说,如何使控件对鼠标不可见,同时仍允许其子级之一接收鼠标事件?

这是一个屏幕截图:

在此处输入图像描述

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

4

3 回答 3

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>
于 2013-01-08T16:44:43.713 回答
1

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

这将为我们提供我们所追求的东西,但看起来很麻烦。同样,我希望有某种方法可以指定 IsHitTestVisible(或 IsEnabled),并以某种方式将它们(及以下)重新确立为行为的所有者。一个人可以做梦。在那之前……层层叠叠!

于 2013-01-09T07:40:33.460 回答
1

免责声明:它看起来不会解决 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" 的父控件的子控件,它只是与背景控件重叠

于 2019-05-18T18:37:29.097 回答