1
votes

I'm trying to integrate XNA into a WPF window, using the WindowsFormsHost control in the WPF window. I've got a very strange problem that whenever XNA is running, my keyboard input into my WPF window controls don't work. More weirdly, this is happening not for all keys. It happens for all the letters and numbers, but, for example, backspace or delete key work. I first thought this was due to XNA hooking up to the keyboard input and handling all the key presses, and the events weren't being routed to my WPF window. But weirdly, they DO get handled by the OnKeyDown. I've created a custom TextBox class that derives from normal TextBox, overrided the OnKeyDown, put a breakpoint in, and it worked. The debugger stepped on the breakpoint. So I was wrong: XNA wasn't blocking the key events from reaching the WPF window (or its controls), my TextBox IS getting the correct keyboard event, but it just doesn't work. I press 'A' on my keyboard, OnKeyDown gets called, but it doesn't append 'A' into the textbox. The backspace key, on the other hand, works normally. I copy paste some text into the field using mouse right click, and I click on the middle of the text (arrows don't work too), I can delete the text by pressing backspace, but I can't type anything.

What can be the reason? I am not really good with WPF's input handling, but normally, if my TextBox DOES get the OnKeyDown event (with the right argument), it should append the letter that I've pressed. As soon as I end the XNA game, things start behaving correctly. What can be the reason for the controls behaving abnormally?

1

1 Answers

2
votes

Someone else has ran into the same problem here: http://forums.create.msdn.com/forums/p/98145/584961.aspx and they've found the solution to the problem (they've also linked to this question, too)

The interoperability of XNA and WPF needs a little tweak:

System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(this);

This code should be pasted to the constructor of the WPF window that will be hosting the XNA content. I've pasted it to the constructr after InitializeComponent() and it worked.