WPF:未初始化的填充属性中断IsMouseOver

时间:2013-01-28 09:05:45

标签: c# wpf ismouseover

我有这个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,即使我点击了这个矩形。

FillIsMouseOver有什么关系?

1 个答案:

答案 0 :(得分:3)

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

如果你想让一个只有边框的透明矩形(或任何其他Shape)仍在内部进行测试,那么请指定Fill="Transparent"

这不仅适用于形状,也适用于GridBorder等容器 - 如果您未指定Background,则其空白区域不会注册打击测试。