2010-03-22 4 views
2

Afin de tirer parti de la capacité de correction orthographique des zones de texte WPF, j'en ai ajouté une à un contrôle utilisateur (avec l'utilisation de elementhost). Ce contrôle utilisateur est utilisé dans différentes formes de fenêtres. Mon problème actuel consiste à essayer de gérer les événements keyup à partir de cette zone de texte, mais le formulaire Windows est incapable d'obtenir un événement du contrôle. Je peux très bien accéder aux propriétés de la zone de texte (texte, longueur, etc.), mais les événements clavier ne semblent pas fonctionner.Gestion des événements du contrôle utilisateur contenant une zone de texte WPF

J'ai trouvé, cependant, que ce qui suit ramènera les événements de la zone de texte WPF:

Public Class MyUserControl 

    Private _elementHost As New ElementHost 
    Private _wpfTextbox As New System.Windows.Controls.Textbox 

    Private Sub MyUserControl_Load(...) Handles Me.Load 
     Me.Controls.Add(_elementHost) 
     _elementHost.Dock = DockStyle.Fill 
     _elementHost.Child = _wpfTextbox 

     Dim MyEventInfo As EventInfo 
     Dim MyMethodInfo As MethodInfo 
     MyMethodInfo = Me.GetType().GetMethod("WPFTextbox_KeyUp") 
     MyEventInfo = _wpfTextBox.GetType().GetEvent("PreviewKeyUp") 
     Dim dlg As [Delegate] = [Delegate].CreateDelegate(MyEventInfo.EventHandlerType, Me, MyMethodInfo) 
     MyEventInfo.AddEventHandler(_wpfTextBox, dlg) 
    End Sub 

    Public Sub WPFTextbox_KeyUp(ByVal sender As Object, ByVal e As RoutedEventArgs) 
     ' something goes here 
    End Sub 

End Class 

Le contrôle utilisateur est maintenant en mesure de faire quelque chose après l'événement PreviewKeyUp est tiré dans la zone de texte WPF. Maintenant, je ne suis pas complètement sûr de savoir comment avoir la forme de la fenêtre contenant ce contrôle utilisateur pour travailler avec cela.

Répondre

3

Im une personne C# ne VB donc s'il vous plaît garder avec moi .. Fondamentalement, vous pouvez attribuer l'événement de votre fenêtre plutôt que dans votre UserControl .. Ainsi, dans le constructeur de votre fenêtre attribuer le PreviewKeyUp:

this.myUserContorl.PreviewKeyUp += new System.Windows.Input.KeyEventHandler(WPFTextbox_KeyUp); 

puis placez le gestionnaire d'événements dans votre fenêtre:

private void WPFTextbox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
    { 

    } 

Soit dit en passant, vous ne devez pas passer par les tracas de capturer l'événement dans votre UserControl que vous pouvez toujours accéder à votre TextBox en vous usercontrol directement depuis votre fenêtre (si vous le rendre public), aga depuis votre constructeur dans votre fenêtre:

this.myUserContorl.wpfTextbox.PreviewKeyUp += new System.Windows.Input.KeyEventHandler(WPFTextbox_KeyUp); 

J'imagine qu'il ressemblerait à ceci en VB (à une estimation):

AddHandler myUserContorl.wpfTextbox.PreviewKeyUp, AddressOf WPFTextbox_KeyUp 
0

ElementHost a une méthode statique appelée EnableModelessKeyboardInterop(). Essayez de l'appeler?

ElementHost.EnableModelessKeyboardInterop(); 

En savoir plus here

0

Semble de base, mais avez-vous mis le KeyPreview à TRUE sur votre formulaire?

alt text

Questions connexes