wpf:在mouseenter / mouseleave上保持矩形填充颜色

时间:2017-09-14 17:06:02

标签: c# wpf

我有一个Grid控件,我动态添加如下所示的行:

enter image description here

我想突出显示鼠标光标在其上的行。我目前通过在行中添加Rectangle作为背景,并在FillMouseEnter更改其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之后所做的事情。

1 个答案:

答案 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);
}