我有这个XAML代码:
<Window x:Class="TTT_01.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" MouseLeftButtonDown="Window_MouseLeftButtonDown">
<Canvas>
<Rectangle Canvas.Left="146" Canvas.Top="110" Height="100" Name="rectangle1" Stroke="Black" Width="200" />
</Canvas>
</Window>
这是后面的C#代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (rectangle1.IsMouseOver)
{
MessageBox.Show("Click!");
}
}
}
我看到的是一个白色矩形。当我点击矩形时,我希望弹出消息框。但是,除非我在XAML或MainWindow构造函数中初始化矩形的Fill
属性,否则不会发生这种情况。如果我没有Fill
初始化,rectangle1.IsMouseOver
仍然false
,即使我点击了这个矩形。
Fill
与IsMouseOver
有什么关系?
答案 0 :(得分:3)
填充是指定控件的命中测试区域的一部分。在WPF控件中,通常进行像素完美的命中测试,而不是矩形测试。例如,如果在XAML中放置<Ellipse/>
,则单击圆周外部,但在边界矩形内部不会在椭圆中生成MouseDown事件(尽管这个事件很明显)。同样,不指定形状的填充意味着形状的内部根本不存在 - 它会对测试产生负面影响并让点击失败。换句话说,没有填充的形状仅构成其命中测试的轮廓。
如果你想让一个只有边框的透明矩形(或任何其他Shape
)仍在内部进行测试,那么请指定Fill="Transparent"
。
这不仅适用于形状,也适用于Grid
和Border
等容器 - 如果您未指定Background
,则其空白区域不会注册打击测试。