Programmatically generate keydown presses for WPF unit tests
You can extend the PresentationSource class like this:
public class FakePresentationSource : PresentationSource{ protected override CompositionTarget GetCompositionTargetCore() { return null; } public override Visual RootVisual { get; set; } public override bool IsDisposed { get { return false; } }}
And use it like this:
var uiElement = new UIElement();uiElement.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, new FakePresentationSource(), 0, Key.Delete) { RoutedEvent = UIElement.KeyDownEvent });
A quicker solution for unit tests is just to mock the PresentationSource object. Note that it requires an STA thread. Sample uses Moq and nunit.
[Test][RequiresSTA]public void test_something(){ new KeyEventArgs( Keyboard.PrimaryDevice, new Mock<PresentationSource>().Object, 0, Key.Back);}
Figured this out after reading this post.
Basically, you need to put your control inside a Window and call Window.Show() on it. The post mentioned an WPF bug, but I didn't encounter this in WPF 4.
After calling Window.Show(), the presentation source will no longer be null and you will be able to send keys to the control.