我有一个Grid
控件,我动态添加如下所示的行:
我想突出显示鼠标光标在其上的行。我目前通过在行中添加Rectangle
作为背景,并在Fill
和MouseEnter
更改其MouseLeave
属性来实现此目的。
Rectangle rect = new Rectangle();
Grid.SetRow(rect, rowNum);
Grid.SetColumn(rect, colNum);
Grid.SetColumnSpan(rect, dataGrd_.ColumnDefinitions.Count);
rect.Fill = new SolidColorBrush(Colors.White);
rect.MouseEnter += Rect_MouseEnter;
rect.MouseLeave += Rect_MouseLeave;
dataGrd_.Children.Add(rect);
private void Rect_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
(sender as Rectangle).Fill = new SolidColorBrush(Colors.White);
}
private void Rect_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
(sender as Rectangle).Fill = new SolidColorBrush(Colors.Yellow);
}
问题是,当鼠标移动到行前景中的一个控件上时,会触发MouseLeave
事件并突然显示突出显示。
只要鼠标位于Rectangle
的范围内,即使它位于前景中的控件之外,是否有办法让突出显示持续存在?
此外,MouseEnter
事件在鼠标进入行时不会触发,但是超过Label
或其他控件。我想我可以为所有控件添加事件处理程序,但这听起来过分了。
由于我是动态添加这些行,我真的只对代码隐藏解决方案感兴趣,除非有办法实现我在XAML之后所做的事情。
答案 0 :(得分:0)
您可以保留对Rectangle
:
private Rectangle rect;
void ...()
{
rect = new Rectangle();
Grid.SetRow(rect, rowNum);
Grid.SetColumn(rect, colNum);
Grid.SetColumnSpan(rect, dataGrd_.ColumnDefinitions.Count);
rect.Fill = new SolidColorBrush(Colors.White);
rect.MouseEnter += Rect_MouseEnter;
rect.MouseLeave += Rect_MouseLeave;
dataGrd_.Children.Add(rect);
dataGrd_.MouseEnter += dataGrd__MouseEnter;
dataGrd_.MouseLeave += dataGrd__MouseLeave;
}
...并为父Grid
处理相同的事件,如下所示:
private void dataGrd__MouseEnter(object sender, MouseEventArgs e)
{
Point p = e.GetPosition(rect);
if (p.X > 0 && p.X <= rect.ActualWidth && p.Y > 0 && p.Y <= rect.ActualHeight)
rect.Fill = new SolidColorBrush(Colors.Yellow);
}
private void dataGrd__MouseLeave(object sender, MouseEventArgs e)
{
Point p = e.GetPosition(rect);
if (p.X < 0 || p.X > rect.ActualWidth || p.Y < 0 || p.Y > rect.ActualHeight)
rect.Fill = new SolidColorBrush(Colors.White);
}