2014-05-02 34 views
1

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

尝试在Window_Loaded事件中移除事件。窗口加载时,样式首先应用于文本框。 –

回答

0

嗨,我们不能退订whcih在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; 
    } 
} 
相关问题