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

时间:2014-05-02 08:02:01

标签: wpf events styles runtime

我已经创建了一个WPF窗口。我已经为文本框创建了样式,其中包含大小信息以及一些事件设置者;然后,我创建了一些分配上述风格的文本框。

现在有一种情况我需要删除该文本框的事件。但我不能这样做。 即使我做了以下事件,事件也没有脱离。它还在那里。 txt9.PreviewLostKeyboardFocus - = txt9_PreviewLostKeyboardFocus;

仅当事件附加在样式本身中时才会发生这种情况。 如果它在TextBox控件内,则事件分离正常。

我的代码: XAML:

    <Window.Resources>
    <ResourceDictionary>
         <Style x:Key="txtStyle11" TargetType="TextBox">
            <Setter Property="Width" Value="150"/>
            <Setter Property="Height" Value="35"/>
            <EventSetter Event="PreviewLostKeyboardFocus" Handler="txt9_PreviewLostKeyboardFocus"/>
        </Style>
    </ResourceDictionary>
    </Window.Resources>

    <Grid MinWidth="50">
    <TextBox Style="{StaticResource txtStyle11}" x:Name="txt9"/>
    </Grid>

CS:

     public MainWindow()
     {
     txt9.PreviewLostKeyboardFocus -= txt9_PreviewLostKeyboardFocus;
     }

1 个答案:

答案 0 :(得分:0)

您好我们无法取消订阅在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;
    }
}