我需要创建一个 RichTextBox 子类,除了它不订阅 UserPreferenceChanged 之外,它在所有方面的工作方式都相同。此事件导致我的应用程序挂起。我必须使用 RichTextBox,并且无法将其交换为 MultiLine=True 的 TextBox 或其他类似的内容。
这是System.Windows.Forms.RichTextBox 订阅的地方;
protected override void OnHandleCreated(EventArgs e)
{
...
SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(this.UserPreferenceChangedHandler);
}
Run Code Online (Sandbox Code Playgroud)
这是处理程序的签名;
private void UserPreferenceChangedHandler(object o, UserPreferenceChangedEventArgs e)
Run Code Online (Sandbox Code Playgroud)
该处理程序不是虚拟的,因此我无法覆盖它。该处理程序是私有的,因此我无法执行简单的-=来取消订阅。我已经研究过使用反射来删除处理程序,但我无法让它工作 - 这就是我到目前为止所拥有的;
public partial class MyRichTextBox : RichTextBox
{
...
private void UnsubscribeUserPreferenceChanged()
{
FieldInfo fieldInfo = typeof(SystemEvents).GetField("OnUserPreferenceChangedEvent", BindingFlags.NonPublic | BindingFlags.Static);
// fieldInfo.ToString() = "System.Object.OnUserPreferenceChangedEvent"
object eventObj = fieldInfo.GetValue(this);
// eventInfo.ToString() = "System.Object"
PropertyInfo propInfo = typeof(RichTextBox).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
// propInfo.ToString() = "System.ComponentModel.EventHandlerList Events"
EventHandlerList …Run Code Online (Sandbox Code Playgroud)