在以下示例中,是否可以在控件的Do X
完成后执行Do Y
(即,退出调用我的事件处理程序的方法)?似乎Do X
的行为与Do Y
混淆,因此在Do X
完成后需要Do Y
完成。
//at form initialisation
someThirdPartyControl.MouseDoubleClick += MyHandler;
void MyHandler(...)
{
e.Handled = true;
//Do X
}
//The control's code may be something like
class SomeThirdPartyControl:Control
{
void override OnMouseDoubleClick(...)
{
//call event handlers
//Do Y
}
}
Do X
可能会改变控件的大小,因此项目的位置可能会发生变化,当发生这种情况时,控件会错误地选择双击后鼠标指针所在的项目。例如,我双击Item 4
,但Do X
更改了控件的大小,Do X
完成后,Item 2
位于鼠标指针下方,该控件选择Item 2
。我想要的是所选项目保持Item 4
。
答案 0 :(得分:1)
如果您继承SomeControl
并覆盖OnMouseDoubleClick
,则只能执行此操作:
class MyControl:SomeControl
{
void override OnMouseDoubleClick(MouseEventArgs e)
{
base.OnMouseDoubleClick(e)
//call event handlers
//Do X
}
}
您甚至可以定义新事件AfterMouseDoubleClick
并触发该事件,而不是在OnMouseDoubleClick
中调用X.
class MyControl:SomeControl
{
public event MouseButtonEventHandler AfterMouseDoubleClick;
void override OnMouseDoubleClick(MouseEventArgs e)
{
base.OnMouseDoubleClick(e)
//call event handlers
OnAfterMouseDoubleClick(e)
}
void virtual OnAfterMouseDoubleClick(MouseEventArgs e)
{
if(AfterMouseDoubleClick != null)
AfterMouseDoubleClick(this, e)
}
}
但是你应该考虑在X中做什么来弄乱Y.
答案 1 :(得分:0)
是的,这很容易,你只需要继承SomeThirdPartyControl
。您甚至可以将其转换为另一个事件并以此方式使用它。
class MyWrapperControl : SomeThirdPartyControl
{
public event MouseEventHandler AfterMouseDoubleClick;
protected void override OnMouseDoubleClick(MouseEventArgs e)
{
base.OnMouseDoubleClick(e); //This will Do X.
OnAfterMouseDoubleClick(e);
}
protected virtal void OnAfterMouseDoubleClick(MouseEventArgs e)
{
var temp = AfterMouseDoubleClick;
if(temp != null)
temp(this, e);
}
}
用过。
//at form initialisation
myWrapperControl.AfterMouseDoubleClick += MyHandler;
void MyHandler(object sender, MouseEventArgs e)
{
//This event is fired after all MouseDoubleClick events have been handled.
//Do X
}
答案 2 :(得分:0)
OnMouseDoubleClick的基本实现调用事件,因此:
如果您不从OnMouseDoubleClick()调用基本实现,则不会触发MyHandler
您可以通过将base.OnMouseDoubleClick()放在任何需要的位置来控制调用的顺序。
void override OnMouseDoubleClick(...)
{
// ...
// Do Y
base.OnMouseDoubleClick(); // Does X among other things...
}