There is a third method, which is to use a HwndHost control. I'm currently using this for an application that I'm working on and it appears to work and meet my needs so far. The main drawback is that most Win32 messages directed to the HWND in the HwndHost are not automatically forwarded to WPF, so I have to actually raise mouse events etc. myself.
Regarding WindowsFormsHost, I haven't tried it but I heard about it after implementing a HwndHost-based DX11Host class. It actually looks like it might be a better method than HwndHost. I may get around to trying this at some point, but I don't see why it won't work.
I have heard of people using a shared surface technique, where you create a D3D9 render target, which should be straightforward in WPF, and somehow getting a D3D11 handle to it. Apparently this works only in Windows 7 or later. I haven't tried this myself, but see