为了利用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事件后执行某些操作。现在,我不完全确定如何使用包含此用户控件的窗口表单来处理此问题。
答案 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?