除非设置了Fill属性,否则Rectangle事件处理程序无法工作:为什么?

时间:2013-12-03 08:37:00

标签: c# wpf xaml

我在我的XAML文件中声明了UniformGrid

<UniformGrid Rows="8" Columns="8" Background="OliveDrab" 
    Name="board" Width="400" Height="400"/>

然后,我想以编程方式向其中添加Rectangle子项,并为每个子项附加一个事件处理程序:

public MainWindow()
{
    InitializeComponent();
    createGrid();
}

private void createGrid()
{
    SolidColorBrush scb = Brushes.Olive;
    for (int i = 0; i < 64; i++)
    {
        Rectangle r = new Rectangle();
            r.Stroke = scb;
        r.MouseLeftButtonDown += Rectangle_MouseLeftButtonDown;
        board.Children.Add(r);
    }
}

private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Console.WriteLine("Rectangle_MouseLeftButtonDown");
}

但是,当我运行应用并点击Rectangle时,永远不会调用Rectangle_MouseLeftButtonDown,除非我设置了Fill属性:

private void createGrid()
{
    SolidColorBrush scb = Brushes.Olive;
    SolidColorBrush whiteScb = Brushes.White;
    for (int i = 0; i < 64; i++)
    {
        Rectangle r = new Rectangle();
        r.Stroke = scb;
        r.Fill = whiteScb;
        r.MouseLeftButtonDown += Rectangle_MouseLeftButtonDown;
        board.Children.Add(r);
    }
}

然后,只有这样,事件才会被触发。

所以我的问题是:为什么必须设置Fill的{​​{1}}属性才能使事件处理程序工作?

感谢。

编辑:正如金景所指出的,它看起来像透明窗口不发送鼠标事件。更多信息:'Transparent Windows in WPF' on msdn

3 个答案:

答案 0 :(得分:3)

这是因为您没有设置Fill属性,Rectangle的背景将是透明的,透明控件对鼠标单击也是“透明的”。命中测试直接进入其下的第一个非透明控件。

答案 1 :(得分:0)

如果您想获得一个可以点击的透明矩形,请尝试

r.Fill = new SolidColorBrush(Colors.Black);
r.Opacity = 0;

答案 2 :(得分:-1)

但是,您可以将Rectangle的Fill属性设置为Transparent,它将传递命中测试并在Rectangle保持透明时发送所需的鼠标事件。