Sign in to follow this  
Saoblol

SlimDX and WPF issue

Recommended Posts

Hi, I'm currently switching my project from WindowForms to WFP, but I'm having problems with rendering into an WPF Image Control.

This is what I do to get the Handle of the Image Control, but instead the scene is rendered across the whole window, not just the specified Image area

[source lang="csharp"]static void InitializeTileEditor()
{
WaterScene scene = new WaterScene();

window = new MainWindow();
window.Show();

HwndSource source = (HwndSource)HwndSource.FromVisual(window.image_Viewport);
//IntPtr viewportHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle;

VEngine.Initialize(window, source.Handle, 1280, 720, 60, true);
VEngine.Run(scene);
}[/source]

I tried two ways of acquiering the handle, but both had the same result.

Any Ideas how I get the exact handle of the Image Control?

Edit: The handle will be used in the 3D Intialization of SlimDX to create the factory

[source lang="csharp"]factory.SetWindowAssociation(viewportHandle,
WindowAssociationFlags.IgnoreAll |
WindowAssociationFlags.IgnoreAltEnter);[/source] Edited by Saoblol

Share this post


Link to post
Share on other sites
Solved this for now by hosting a WindowForm Picturebox in the WPF Grid element, not very pretty but it does the job and doesnt have an impact on performance. Will probably look into it again when im closer to release, but I'd like to prioritize on other stuff first.

Code example for anyone who wants to do it the non-pretty way too:

[CODE]
private void window_TileEditor_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost();
this.viewport = new System.Windows.Forms.PictureBox();
this.viewport.MouseEnter += new System.EventHandler(this.viewport_MouseEnter);
this.viewport.MouseLeave += new System.EventHandler(this.viewport_MouseLeave);
this.viewport.Width = 1280;
this.viewport.Height = 720;
host.Child = this.viewport;
this.grid_Viewport.Children.Add(host);
}
[/CODE]

[s]Sadly, Im encountering another problem with WPF just after getting rid of this one. Since I need to update the Engine over and over, I cant use window.ShowDialog() since that halts the application, and window.Show() works but when using that, some of the WPF controls don't work properly anymore (cant type into text fields, but still can paste into them and delete stuff, just not type new characters directly, stuff like that)

Im already calling the Application.DoEvents() method but some stuff still doesnt work. Anything I forgot to do there?

Thanks again[/s]


Solved!

Found the solution after googling a lot:

Add WindowsFormsIntegration to your references, then:

[CODE]
YourWindow window = new YourWindow(); //Your WPF window class
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window);
[/CODE]

Done :) Hope this helps someone too. Edited by Saoblol

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this