实现UserControl的最简单方法是什么,当鼠标悬停在其上方时,该模板会模仿在其周围绘制边框的“热轨”效果?
我试图继承一个自定义控件来覆盖绘制边框的OnMouseHover事件(似乎事件没有被触发),但是我没有成功。
谢谢!
答案 0 :(得分:2)
您可以在UC中使用精心放置的Panel控件模拟用户控件周围边框的外观,并通过监控低级别Windows消息来观察鼠标的位置。
在UserControl设计图面上添加面板并调整面板大小,以便只显示UC设计图面的一小部分(参见下面的注释*)。设计表面的可见部分将成为您的彩色边框,因此相应地设置其“厚度”。将组成UC的其他控件添加到面板中。
您的控件可能如下所示:
在UC中实施IMessageFilter接口。在PreFilterMessage()的实现中,您将检查鼠标相对于UC的位置,并在鼠标悬停在UC上时将UC的BackColor设置为边框颜色,或者在没有时将其设置为默认颜色。因为面板的BackColor没有改变,所以用户看起来就像你的UC边界一样。
以下是您执行此操作所需的最少代码量:
public partial class UserControl1 : UserControl, IMessageFilter
{
public UserControl1() {
InitializeComponent();
Application.AddMessageFilter(this);
}
public bool PreFilterMessage(ref Message m) {
if (!this.IsDisposed && this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) {
this.BackColor = Color.Green; // Or whatever border color you want.
} else {
this.BackColor = SystemColors.Control; // Back to the UC's default border color.
}
return false;
}
}
注意:当我测试这个时,我很难让我的Panel的BackColor设置不透明。我通过暂时将设计器中的BackColor更改为不同的颜色然后将其更改回我的默认颜色(Control)来修复此问题。
答案 1 :(得分:0)
尝试向控件的“MouseEnter”和“MouseLeave”事件添加处理程序,这些事件将更改控件的BorderStyle(如果有的话)。当鼠标在控件边框内移动时会触发MouseEnter,当鼠标退出该边框时会触发MouseLeave。 MouseHover可能有一些额外的规则,比如鼠标必须静止一段时间。