我在我的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。
答案 0 :(得分:3)
这是因为您没有设置Fill
属性,Rectangle
的背景将是透明的,透明控件对鼠标单击也是“透明的”。命中测试直接进入其下的第一个非透明控件。
答案 1 :(得分:0)
如果您想获得一个可以点击的透明矩形,请尝试
r.Fill = new SolidColorBrush(Colors.Black);
r.Opacity = 0;
答案 2 :(得分:-1)
但是,您可以将Rectangle的Fill
属性设置为Transparent
,它将传递命中测试并在Rectangle保持透明时发送所需的鼠标事件。