为了利用 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/