C# 如何在WPF应用程序中放置自定义windows窗体控件?

C# 如何在WPF应用程序中放置自定义windows窗体控件?,c#,wpf,user-controls,C#,Wpf,User Controls,作为一个短期解决方案,我正在尝试将windows窗体“usercontrol”插入WPF应用程序。我在WPF应用程序视图中看到,我可以向项目中添加一个“自定义windows窗体控件”,它会生成一个空的自定义控件,但我不知道如何添加它。理想情况下,我想知道如何从已编译的windows窗体用户控件中获取.dll并将其粘贴到WPF应用程序中,或者将用户控件导入WPF应用程序中 谢谢, Sam您不能像Windows窗体应用程序那样将其作为控件添加到工具箱中。您应该做的是在WPF应用程序中“托管”用户控件

作为一个短期解决方案,我正在尝试将windows窗体“usercontrol”插入WPF应用程序。我在WPF应用程序视图中看到,我可以向项目中添加一个“自定义windows窗体控件”,它会生成一个空的自定义控件,但我不知道如何添加它。理想情况下,我想知道如何从已编译的windows窗体用户控件中获取.dll并将其粘贴到WPF应用程序中,或者将用户控件导入WPF应用程序中

谢谢,
Sam

您不能像Windows窗体应用程序那样将其作为控件添加到工具箱中。您应该做的是在WPF应用程序中“托管”用户控件

下面是一个如何使用屏蔽文本框的示例(您可以轻松修改该文本框以使用自定义控件):


在项目中添加对System.Windows.Forms和WindowsForms集成的引用

xmlns:WinForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns:WindowsFormsIntegration="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
并将Windows窗体宿主放置在窗口中

  <WindowsFormsHost Name="wfhDate"  
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Stretch">
                <WinForms:FlowLayoutPanel/>
  </WindowsFormsHost>

卢卡斯的回答是正确的,但我想补充一些必要的东西。如果要创建web应用程序,则必须将安全设置更改为“这是完全信任的应用程序”。在执行此操作之前,我无法使WindowsFormsHost控件正常工作。

@Lucas:我从上面准确复制了XAML,它编译时没有出错,我还没有输入C代码,因为我只是想确保XAML正常工作。我运行了应用程序,它因以下异常而崩溃:System.Windows.Markup.XamlParseException未经处理消息:无法创建程序集“WpfUploaderTwo,Version=1.0.0,Culture=neutral,PublicKeyToken=null”中定义的“Page1”的实例。调用的目标已引发异常。标记文件“Page1.xaml”第1行第7位出错。如果去掉WindowsFormsHost位,它就可以正常工作。链接到代码和错误:啊,所以我将“WPF Web应用程序”设置为“WPF应用程序”,不确定这是否有任何关系。我也完全按照原样尝试了此代码,得到了与我上面提到的相同的错误。您是否在引用文件夹中添加了对
System.Windows.Forms
程序集的引用?是的,将它们添加到了引用文件夹中。我环顾四周,回到了您链接的页面,然后发现上面的页面显示了如何使用c#而不是XAML添加WF控件。我试过了,它成功了,所以无论出于什么原因,在开发WPF Web应用程序时,我都不能通过XAML让它工作,但我可以通过c#。将这个家伙作为答案,因为它引导我找到了解决方案:太棒了,这完全符合预期。我能够从我的windows窗体用户控件中获取生成的dll文件,并将其添加为引用,然后将其添加到WindowsFormsHost。可爱。
  <WindowsFormsHost Name="wfhDate"  
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Stretch">
                <WinForms:FlowLayoutPanel/>
  </WindowsFormsHost>
using Forms = System.Windows.Forms;
.........................
Forms.FlowLayoutPanel flpPanel = this.wfhDate.Child as Forms.FlowLayoutPanel;
// Initialize your Forms contol here.
flpPanel.Controls.Add( yourControl );