Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何删除通过样式分配的事件处理程序_Wpf_Events_Styles_Runtime - Fatal编程技术网

Wpf 如何删除通过样式分配的事件处理程序

Wpf 如何删除通过样式分配的事件处理程序,wpf,events,styles,runtime,Wpf,Events,Styles,Runtime,我已经创建了一个WPF窗口。我已经为一个文本框创建了样式,其中包含大小信息和一些事件设置器;然后,我创建了一些指定上述样式的文本框 现在,对于一个例子,我需要删除该文本框的事件。但我不能那样做。 即使我做了以下操作,事件也不会分离。它还在那里。 txt9.PreviewLostKeyboardFocus-=txt9_PreviewLostKeyboardFocus 仅当事件附加到样式本身时,才会发生这种情况。 如果它在TextBox控件内,则事件可以很好地分离 我的代码: XAML: 您好,我们

我已经创建了一个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;
    }
}