wpf - 处理来自包含 WPF 文本框的用户控件的事件

标签 wpf vb.net events user-controls

为了利用 WPF 文本框的拼写检查功能,我向用户控件添加了一个(使用 elementhost)。该用户控件用于各种窗口形式。我当前的问题是尝试处理来自此文本框的 keyup 事件,但 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 事件后执行某些操作。现在,我不完全确定如何让包含此用户控件的窗口窗体与此一起使用。

最佳答案

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

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

然后将事件处理程序放入您的窗口中:

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

    }

顺便说一句,您不必经历在 UserControl 中捕获事件的麻烦,因为您仍然可以直接从 Window 中访问 UserControl 中的 TextBox(如果将其公开),再次从 Window 中的构造函数访问:

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

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

AddHandler myUserContorl.wpfTextbox.PreviewKeyUp, AddressOf WPFTextbox_KeyUp

关于wpf - 处理来自包含 WPF 文本框的用户控件的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496247/

相关文章:

vb.net - 如何使用 vb.net 获取 X、Y 处像素的颜色

c# - 如何停止在表单关闭时触发文本框离开事件

c# - WPF 组合框问题

asp.net - RDLC:本地报告处理期间发生错误

c# - WPF 显示每个图像 x 秒如何?

vb.net - VS2010 版本更改后如何保持 CLSID 不变 - 二进制兼容性?-

javascript - 不需要的多个来电

jquery - 尝试使用 setTimeout 来创建一个小的延迟,但它不起作用

wpf - MVVM - 如何显示 View ?

.net - 通过 WCF 传递图像并将它们显示在 WPF 数据网格中