Wpf 如何删除通过样式分配的事件处理程序
我已经创建了一个WPF窗口。我已经为一个文本框创建了样式,其中包含大小信息和一些事件设置器;然后,我创建了一些指定上述样式的文本框 现在,对于一个例子,我需要删除该文本框的事件。但我不能那样做。 即使我做了以下操作,事件也不会分离。它还在那里。 txt9.PreviewLostKeyboardFocus-=txt9_PreviewLostKeyboardFocus 仅当事件附加到样式本身时,才会发生这种情况。 如果它在TextBox控件内,则事件可以很好地分离 我的代码: XAML:Wpf 如何删除通过样式分配的事件处理程序,wpf,events,styles,runtime,Wpf,Events,Styles,Runtime,我已经创建了一个WPF窗口。我已经为一个文本框创建了样式,其中包含大小信息和一些事件设置器;然后,我创建了一些指定上述样式的文本框 现在,对于一个例子,我需要删除该文本框的事件。但我不能那样做。 即使我做了以下操作,事件也不会分离。它还在那里。 txt9.PreviewLostKeyboardFocus-=txt9_PreviewLostKeyboardFocus 仅当事件附加到样式本身时,才会发生这种情况。 如果它在TextBox控件内,则事件可以很好地分离 我的代码: XAML: 您好,我们
您好,我们无法取消在EventSetter中订阅的事件,因为 内部EventSetter类变得不可变,因此 无法修改EventSetter对象。下面是我尝试过的样本 举例说明同样的情况。当我们尝试更改 setterbase类的属性
public partial class MainWindow : Window
{
KeyboardFocusChangedEventHandler mydelegate, emptydelegate;
EventSetter eventSetter;
public MainWindow()
{
InitializeComponent();
emptydelegate = delegate(object sender, KeyboardFocusChangedEventArgs e)
{
};
mydelegate = delegate(object sender, KeyboardFocusChangedEventArgs e)
{
MessageBox.Show("My Own Event is still Unsubscribed");
};
eventSetter = new EventSetter();
eventSetter.Event = TextBox.PreviewLostKeyboardFocusEvent;
eventSetter.Handler = mydelegate;
Style myStyle = new System.Windows.Style(txt9.GetType());
myStyle.Setters.Add(eventSetter);
txt9.Style = myStyle;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
eventSetter.Handler= emptydelegate;
}
}
请尝试删除Windows\u加载事件中的事件。加载窗口时,样式首先应用于文本框。
public MainWindow()
{
txt9.PreviewLostKeyboardFocus -= txt9_PreviewLostKeyboardFocus;
}
public partial class MainWindow : Window
{
KeyboardFocusChangedEventHandler mydelegate, emptydelegate;
EventSetter eventSetter;
public MainWindow()
{
InitializeComponent();
emptydelegate = delegate(object sender, KeyboardFocusChangedEventArgs e)
{
};
mydelegate = delegate(object sender, KeyboardFocusChangedEventArgs e)
{
MessageBox.Show("My Own Event is still Unsubscribed");
};
eventSetter = new EventSetter();
eventSetter.Event = TextBox.PreviewLostKeyboardFocusEvent;
eventSetter.Handler = mydelegate;
Style myStyle = new System.Windows.Style(txt9.GetType());
myStyle.Setters.Add(eventSetter);
txt9.Style = myStyle;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
eventSetter.Handler= emptydelegate;
}
}