1

我有这个 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!");
        }
    }
}

我看到的是一个白色的矩形。当我单击矩形时,我希望会弹出消息框。但这不会发生,除非我Fill在 XAML 或 MainWindow 构造函数中初始化矩形的属性。即使我单击矩形,也没有被Fill初始化。rectangle1.IsMouseOverfalse

有什么Fill关系IsMouseOver

4

1 回答 1

3

填充是指定控件的命中测试区域的一部分。在 WPF 控件中,通常会进行像素完美的命中测试,而不是矩形的。例如,如果您<Ellipse/>在 XAML 中放置一个,在圆周外单击,但在边界矩形内不会在 Ellipse 中生成 MouseDown 事件(虽然这很明显)。同样,不为形状指定填充意味着形状的内部根本不存在——它对测试产生负面影响,让点击失败。换句话说,没有填充的形状仅构成它们的轮廓,用于命中测试。

如果您希望有一个仅边框透明矩形(或任何其他Shape)仍然在内部进行测试,然后指定Fill="Transparent".

这不仅适用于形状,而且适用于像Gridand这样的容器Border- 如果您不指定 a Background,那么它们的空白区域不会在命中测试中注册。

于 2013-01-28T09:16:12.713 回答