dotnet / winforms

Windows Forms is a .NET UI framework for building Windows desktop applications.
MIT License
4.4k stars 980 forks source link

ElementHost control (Wpf Interoperability) do not display in Toolbox WinForms designer And Can not add Wpf UserControl in winform designer #9443

Open MauNguyenVan opened 1 year ago

MauNguyenVan commented 1 year ago

Environment

VisualStudio 17.6.4

.NET version

Did this work in a previous version of Visual Studio and/or previous .NET release?

It works in .NET framework 4.8

Issue description

ElemenHostNotFound

WpfControlCannotAdd

Steps to reproduce

Image WinFormApp .net core 7.0

image

But with .net framework 4.8 has it and works fine

Untitled

Diagnostics

No response

elachlan commented 1 year ago

@Olina-Zhang can you check if this repros in .net 6 please?

MauNguyenVan commented 1 year ago

In my computer, .NET 6 has the same error

elachlan commented 1 year ago

Much appreciated. Team will need to have a look.

Olina-Zhang commented 1 year ago

@Olina-Zhang can you check if this repros in .net 6 please?

There are known issues in Winforms designer repo: https://github.com/microsoft/winforms-designer/issues/919, https://github.com/microsoft/winforms-designer/issues/2626.

MauNguyenVan commented 1 year ago

@Olina-Zhang can you check if this repros in .net 6 please?

There are known issues in Winforms designer repo: https://github.com/microsoft/winforms-designer/issues/919, https://github.com/microsoft/winforms-designer/issues/2626.

Sorry, these URLs do not exist. maybe i have not permission

elachlan commented 1 year ago

@MauNguyenVan the designer repo is currently closed source.

merriemcgaw commented 1 year ago

This is known work that we have on our backlog in our private Designer repo. We don't have a specific timeline yet. We will keep you posted.

dotMorten commented 8 months ago

I spent quite a time on this too, only to finally find this issue. Would love to see this fix as I have customers relying on this control to bring WPF controls into winforms.

ImHappyMostOfTheTime commented 7 months ago

This has been holding me back from migrating my main framework project to .net. I've worked around it by manually editing the form designer to add an element host (copying what happens to do the same thing in a framework app) Annoyingly if you create a wpf usercontrol, this will show up in the toolbox , but dragging it on to the form causes an error.

On this screen shot you can see I've manually added the wpf ctrl by hand, but if I drag from the toolbox I get this error.

elementhost

bernox89 commented 6 months ago

Is there any news for this problem? I have a project in .net core, but I didn't know about the problem otherwise I would have created the project in .net framework.

molt2020 commented 5 months ago

Same here, stuck trying to port to .NET 8. Initially build worked and my ElementHost-ed WPF component worked well and then... it just dissapeared from the designer.

I can still see my WPF user control in the Toolbox palette but I can't see Element Host / WPF integration anymore and I can't add the WPF user control directly. It comes up with a generic message how the component should implement IComponent and have suitable constructor but this is already the case and I can use the WPF component in WPF projects so it must be the designer issue.

If there is no timeline for the Designer fix, could you at least provide a workaround or any insight into what is happening??

dotMorten commented 5 months ago

@molt2020 the elementhost works just fine - you just have to add it in code (or copy it over from a framework version). It’s only that it won’t show in the designer but otherwise the designer continues to work for other controls

molt2020 commented 5 months ago

Thank you @dotMorten - I reverted the code and it compiles and works! 👍

It would be good to have this fixed so it shows in the palette as manually editing designer files is no fun

bernox89 commented 5 months ago

@molt2020 the elementhost works just fine - you just have to add it in code (or copy it over from a framework version). It’s only that it won’t show in the designer but otherwise the designer continues to work for other controls

I didn't succeed without having it in the toolbox. Can you give some examples of how you managed to integrate the control. A thousand thanks.

molt2020 commented 5 months ago

@bernox89 I just reverted code back to what Designer made and after Designer decided to remove the entire component from the designer code. So far, the Designer has not removed the code again. Here is the code in case it is helpful

private System.Windows.Forms.Integration.ElementHost elementHost_CurrentRecordInfo; this.elementHost_CurrentRecordInfo = new System.Windows.Forms.Integration.ElementHost(); this.elementHost_CurrentRecordInfo.Child = this.myWPFControl;

there is no other ElementHost-specific code to hoist the myWPFControl into it. There is some extra code int the designer to place the elementHost_CurrentRecordInfo onto the Windows Form (i.e. into a Grid Cell etc) which will be different for your project anyway so I have removed it from the post here as clutter.

You don't have to keep this in the .Designer.cs file either if you worry the Designer may overwrite or remove it.

Hope it helps.

bernox89 commented 5 months ago

thanks for the help anyway. I solved it independently only from C# code following these steps, without having elementhost available from the toolbox:

  1. Set properties in winforms project to also use WPF
  2. Import any WPF libraries using project references
  3. Enter any uses for the wpf controls/libraries
  4. with this code example it works great, in my case I needed to have the syncfusion tool to edit images and have it on winforms which does not exist natively.

using section: using System.Windows.Forms.Integration; using Syncfusion.Licensing; using Syncfusion.Windows.Controls; using Syncfusion.Windows.Shared; using Syncfusion.Windows.Tools; using Syncfusion.UI.Xaml.ImageEditor;

code to use the control:

SfImageEditor imageEditor = new SfImageEditor(); ElementHost host = new ElementHost(); host.Dock = DockStyle.Fill; host.Child = imageEditor; this.Controls.Add(host); host.Dock = DockStyle.Fill;

I hope I have been useful to someone

the only thing we don't have is the graphic control available in the designer, but it comes second in my opinion.

ImHappyMostOfTheTime commented 5 months ago

While its possible to add a wpf control/ElementHost by hand I'm reluctant to do this in my production project as it doesn't feel like its supported by Microsoft. Perhaps this is Microsoft's way of pushing us to use WinUI 3? I wouldn't mind but WinUI is missing so many features, feels like its still very early in development. So for now I'm choosing to stay with .net framework which I don't really want to.

IefVandepitte commented 4 months ago

Started to get this behaviour after updating vs to 17.10. Stopped using the out of process designer for winforms, reopened the solution and now it's back in the toolbox

xmaxrayx commented 3 months ago

reponing doesn't fix the issue for me, net 8.

xmaxrayx commented 3 months ago

Ok I switched from Net 8 to NET Framework 4(only windows), and fixed my issue.

dotMorten commented 3 months ago

@ImHappyMostOfTheTime what makes you think it isn’t supported? It’s fully supported in your app. It is only the design time experience that isn’t. If a lacking design time experience would be the reason something isn’t supported you’d think winui3 is completely unsupported since it doesn’t have a designer at all 😉

ImHappyMostOfTheTime commented 3 months ago

@dotMorten , I think having to edit a file that clearly says it shouldn't be edited doesn't suggest its supported.