65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 WPF 将 .NET WinForms 应用程序嵌入 Internet 浏览器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (35投票s)

2008 年 12 月 2 日

CPOL

4分钟阅读

viewsIcon

282797

downloadIcon

6952

使用 WPF 将 .NET WinForms 应用程序嵌入 Internet 浏览器。

引言

本文将介绍如何使用 WPF 浏览器应用程序将 .NET Windows Forms 应用程序嵌入到 Web 浏览器中。基本上,本文将向您展示如何通过对项目进行少量修改(并且不对 WinForms 应用程序进行任何代码修改)来使任何 Windows Forms .NET 应用程序支持 Web。

现在,我意识到这有点取巧,本文并没有真正展示如何将 .NET Windows Forms 应用程序转换为 WPF。如果您想利用 WPF 的所有功能,最终您将需要用 WPF 重写您的 GUI。但是,如果短期内无法将所有 GUI 代码转换为 WPF,那么这个解决方案是一个基本的解决方法,可以让您在线托管您的应用程序。

创建示例 Windows Forms 应用程序

本文的第一步将是创建一个简单的 Windows Forms C# 应用程序。可以是任何 WinForms 应用程序,但为了本文的目的,我将创建一个计算斐波那契数并将其显示在用户界面上的小型应用程序。此 WinForms 应用程序可以是 .NET 2.0 或 3.5。

1_VisualStudioCreateWinFormProject.jpg

我的应用程序将有一个名为 MainForm 的窗体,一个名为 btnCalculate 的按钮和一个名为 txtResult 的文本框。

2_Fibonacci_WindowsForm.jpg

这是按钮点击事件和斐波那契计算的代码

static int Fibonacci(int x)
{
    if (x <= 1)
    {
        return 1;
    }
    return Fibonacci(x - 1) + Fibonacci(x - 2);
}

private void btnCalculate_Click(object sender, EventArgs e)
{
    txtResult.Text = Fibonacci(10).ToString();
}

现在我们有了示例应用程序,下一步是将其转换为类库。右键单击您的项目并选择“属性”。在“应用程序”选项卡中的“输出类型”组合框中,选择“类库”,然后保存并重新生成。

3_ChangeProjectTypeToClassLibrary.jpg

请注意,为了让您的应用程序在 WPF 中被引用,这是您需要对 Windows Forms 项目进行的唯一更改。

创建 WPF 浏览器宿主应用程序

下一步将是创建一个 WPF 浏览器应用程序。您可以在与 Windows Forms 应用程序相同的解决方案中创建它,或者在新的解决方案中创建。在此示例中,我将简单地将 WPF 浏览器应用程序项目添加到同一个解决方案中。我将这个新项目命名为 WPFHost

4_CreateWPFBrowserApplicationProject.jpg

我们要做的第一件事是从 WPFHost 项目向我们的 WinForms Fibonacci 应用程序添加引用。

5_AddReference.jpg

由于 WinForms 项目在同一个解决方案中,我们将添加对 Fibonacci 项目的引用。如果 WinForms 应用程序在不同的解决方案中,我们将浏览到创建的 DLL 并添加对它的引用。

6_AddReference.jpg

我们还需要在 .NET 选项卡中添加对 Windows Forms Integration 和 System Windows Forms Component 的引用。

7_AddReferenceWindowsFormsIntegration.jpg

8_AddReferenceSystemWindowsForms.jpg

下一步是在我们的 Page1 XAML 窗口中添加一个 StackPanel

Page1.xaml 的完整 XAML 是

<Page x:Class="WPFHost.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Page1">
    <Grid>
        <StackPanel Margin="0,0,0,0" Name="stackPanel" 
           HorizontalAlignment="Left" VerticalAlignment="Top" />
    </Grid>
</Page>

好的,我们差不多完成了。下一步将是向我们项目中的 Page1.xaml.cs 添加一些代码。魔术将发生在 Page1 构造函数中。我们的代码将创建一个 WindowsFormHost 对象,并将之前在 Fibonacci 程序集中创建的 MainForm 对象指定为其子项。然后,WindowsFormHost 将作为子项添加到我们的 WPF StackPanel 中。唯一其他不寻常的代码行是将 MainForm 对象的 TopLevel 属性设置为 false。我不确定这为什么是必需的,但如果您不执行此步骤,您将收到编译错误。

代码如下所示

using System.Windows.Controls;
using System.Windows.Forms.Integration;
using Fibonacci;

namespace WPFHost
{
    /// <summary>
    /// Interaction logic for Page1.xaml
    /// </summary>
    public partial class Page1 : Page
    {
        private readonly MainForm mainForm = new MainForm();

        public Page1()
        {
            InitializeComponent();

            //Create a Windows Forms Host to host a form
            WindowsFormsHost windowsFormsHost = new WindowsFormsHost();
            
            stackPanel.Width = mainForm.Width;
            stackPanel.Height = mainForm.Height;
            windowsFormsHost.Width = mainForm.Width;
            windowsFormsHost.Height = mainForm.Height;
          
            mainForm.TopLevel = false;

            windowsFormsHost.Child = mainForm;

            stackPanel.Children.Add(windowsFormsHost);
        }
    }
}

别忘了保存。

好的,这是最后一步,我保证。这也是最晦涩难懂的一步,我花了一些时间才弄清楚。当我第一次创建 WPF 项目时,我可以在常规 WPF 应用程序中运行这段代码,但在 WPF 浏览器应用程序中尝试时,我总是收到一个奇怪的错误。我几乎放弃了,认为也许无法在 Web 浏览器中托管 Windows Forms 应用程序。最后,我在 Google Groups 上发现了一个帖子,它给了我解决方案。最后一步是右键单击 WPFHost 项目,选择“属性”,然后导航到“安全性”选项卡。在该选项卡中,将单选按钮从“这是一个部分信任的应用程序”更改为“这是一个完全信任的应用程序”。

10_FullTrustApplication.jpg

好的,我撒谎了,还有一步。右键单击您的 WPFHost 项目并选择“设置为启动项目”。

保存,编译,然后运行。您应该会看到您的默认 Web 浏览器打开并显示以下页面

11_FinalOutput.jpg

结论

就是这样。如果您想将创建的 .xbap 嵌入到 HTML 网页中,可以使用 <iframe> 标签,如下所示

<iframe src="WPFHost.xbap" width="329" height="443" />
© . All rights reserved.