我正在尝试创建一个自定义ContextMenu, S4ContextMenu
的,实现 IDisposable 来处理内存泄漏问题,如本博客中所建议的那样:
http://silverlight.codeplex.com/workitem/6206
如博客中所述,我已将此代码包含在 S4ContextMenu 的 Dispose 函数中:
MethodInfo infos = typeof(ContextMenu).GetMethods(BindingFlags.NonPublic |
BindingFlags.Instance).Where(a =>
a.Name.Equals("HandleRootVisualMouseMove")).FirstOrDefault();
Delegate handler = Delegate.CreateDelegate(typeof(MouseEventHandler), this , infos);
EventInfo info = Application.Current.RootVisual.GetType().GetEvent("MouseMove");
info.RemoveEventHandler(Application.Current.RootVisual, handler);
它编译得很好,但是当我运行它时,我得到一个 MethodAccessException: " Attempt by method 'S4.Analytics.Client.Controls.S4ContextMenu.Dispose(Boolean)' to access method 'System.Windows.Controls.ContextMenu.HandleRootVisualMouseMove(System.Object, System.Windows.Input.MouseEventArgs)' failed.
"
我试过让 MethodInfoS4ContextMenu
代替,ContextMenu
但它返回 null。
我正在开发VS 2010, targeting Silverlight 4
.
我错过了什么?
如何创建此委托?
尽管我更喜欢使用这种方法来处理内存泄漏问题,但如果有人有另一种可行的方法(并且不涉及编辑实际的ContextMenu
or toolkit
),那将是很棒的。