我正在尝试退订此事件(对于 cefsharp 事件):
wbPrzegladarka.FrameLoadEnd += async (sender, args) =>
{
//Wait for the Page to finish loading
if (args.Frame.IsMain)
{
await args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');");
}
};
在这种情况下,当再次加载页面时,不应再触发它。我不确定如何处理lambda。
编辑:
我尝试过:
EventHandler<FrameLoadEndEventArgs> handlerFrameLoadEnd = async (sender, args) =>
{
//Wait for the Page to finish loading
if (args.Frame.IsMain)
{
await args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');");
}
};
wbPrzegladarka.FrameLoadEnd += handlerFrameLoadEnd;
但是由于某种原因,该事件根本没有触发。
编辑:
还尝试了 Neil的函数事件:
wbPrzegladarka.FrameLoadEnd += FrameLoad;
wbPrzegladarka.FrameLoadEnd -= FrameLoad;
void FrameLoad(object sender, EventArgs args)
{
//Wait for the Page to finish loading
if (args.Frame.IsMain)
{
args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');").Wait();
}
}
但是由于某种原因,根本不会触发:/
答案 0 :(得分:2)
将lambda移至函数中,然后以常规方式订阅/取消订阅委托。
wbPrzegladarka.FrameLoadEnd += FrameLoad;
wbPrzegladarka.FrameLoadEnd -= FrameLoad;
void FrameLoad(object sender, EventArgs args)
{
//Wait for the Page to finish loading
if (args.Frame.IsMain)
{
args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');").Wait();
}
}
答案 1 :(得分:2)
将lambda表达式移动到单独的方法中,然后在该方法内退订。
//subscribe
wbPrzegladarka.FrameLoadEnd += FrameLoad;
public async void FrameLoad(object sender, FrameLoadEndEventArgs args)
{
if (args.Frame.IsMain)
{
await args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');");
//Unsubscribe
wbPrzegladarka.FrameLoadEnd -= FrameLoad;
}
}
答案 2 :(得分:1)
我的最终解决方案是,当我在类中声明一个字段时:
EventHandler<FrameLoadEndEventArgs> handlerFrameLoadEnd;
取消订阅是事件的内部内容
handlerFrameLoadEnd = async (sender, args) =>
{
//Wait for the Page to finish loading
if (args.Frame.IsMain)
await args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');");
wbPrzelgadarka.FrameLoadEnd -= handlerFrameLoadEnd;
};
我还需要记住在活动结束后订阅它:
wbPrzegladarka.FrameLoadEnd += handlerFrameLoadEnd;