我有一条在边框内的消息,显示在MDI客户区前面。因为它只是一条消息,所以我将它设置为IsHitTestVisible
为假。为方便起见,我还在其中包含了一个按钮,因此用户只需单击按钮即可开始新图表。
但是,由于边框的IsHitTestVisible
设置为False
,因此会短按按钮的True
值,因此用户无法点击该按钮。
那就是说,如何让一个控件对鼠标不可见,同时仍允许其中一个孩子接收鼠标事件?
以下是截图:
我们希望带有文本的蓝色区域被点击测试不可见,但我们希望按钮仍然可以被按下。思考? (是的,我已经知道将两个项目堆叠在一个网格中,但这与布局混淆。
答案 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”的父级的子级,而只是与后台控件重叠