处理包含WPF文本框的用户控件中的事件

时间:2010-03-22 22:33:00

标签: wpf vb.net events user-controls

为了利用WPF文本框的拼写检查功能,我在用户控件中添加了一个(使用了elementhost)。该用户控件用于各种窗口形式。我目前的问题是尝试处理来自此文本框的键盘事件,但Windows窗体无法从控件中“获取”任何事件。我可以很好地访问文本框的属性(即文本,长度等),但键盘事件似乎不起作用。

但是,我发现以下内容将从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

现在,用户控件能够在WPF文本框中触发PreviewKeyUp事件后执行某些操作。现在,我不完全确定如何使用包含此用户控件的窗口表单来处理此问题。

3 个答案:

答案 0 :(得分:3)

我是一个C#人而不是VB所以请耐心等待..基本上你可以从你的Window而不是你的UserControl中分配事件。所以在你的Window的构造函数中指定PreviewKeyUp:

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

然后将事件处理程序放在Window中:

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

    }

顺便说一句,您无需在UserControl中捕获事件的麻烦,因为您仍然可以直接从Window(如果您公开)访问UserControl中的TextBox,再次从Window中的构造函数访问:< / p>

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

我想在VB中看起来会像这样(猜测):

AddHandler myUserContorl.wpfTextbox.PreviewKeyUp, AddressOf WPFTextbox_KeyUp

答案 1 :(得分:0)

ElementHost有一个名为EnableModelessKeyboardInterop()的静态方法。试试吧?

ElementHost.EnableModelessKeyboardInterop();

了解更多here

答案 2 :(得分:0)

似乎很基本,但您是否在表单上将KeyPreview设置为TRUE?

alt text