1. 程式人生 > >ComponentOne使用技巧——從Winform穿越到WPF

ComponentOne使用技巧——從Winform穿越到WPF

概述

WPF 和 Winform 是兩個單獨的平臺,但二者又都是基於 .NET 4.0 以上版本開發的,所以很多.NET開發人員就開始研究如何在WPF中使用Winform。微軟已經架設了兩個開發平臺的之間的通訊橋樑,目前為止二者相互轉換使用已經相當成熟了,今天主要給大家講講如何在這兩個平臺下呼叫 ComponentOne 的控制元件。

本文主要用 FlexReport .NET報表控制元件,作為介質進行兩個平臺的連結

Step 1

首先,我們還是把兩個平臺的基本通訊通道搭建起來,很簡單,網上有很多步驟,總結起來主要分三步:

  1. 新增兩個引用:WindowsFormsIntegration.dll(負責整合WPF和Windows)、System.Windows.Forms.
  2. 在 XAML檔案中新增兩個引用(粗體部分):
<Window x:Class="CrossBowDemo.MainWindow"
xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:wf ="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Hosting Windows Forms Control In WPF" Height="300" Width="650" ResizeMode="NoResize" Loaded="WindowLoadedHandler"> < /Window>

解釋一下,這段程式碼真正起作用的是這個引用WindowsFormsIntegration.dll,而這個引用System.Windows.Forms 指的是Winform裡面的微軟的原生態控制元件,所以在用到ComponentOne時,可以不引用它。

我們先看一個示例:通過微軟原生態控制元件在WPF中使用Winform,程式碼如下:

<wfi:WindowsFormsHost>
        <wf:DataGridView x:Name="Dg"  Dock="Fill" SelectionMode="FullRowSelect">            
        </wf:DataGridView>
    </wfi:WindowsFormsHost>

WindowsFormsHost其實是Winform在WPF的容器,所以Winform的控制元件顯示都要在這個容器裡面。

Setp2

上面我們說了,我們以FlexReport為介質進行通訊,那我們需要準備的幾個小步驟:

  1. Winform下FlexReport的模板
  2. 相關引用

注意:這裡面的引用是Winform的引用。同樣,我們需要在xmal中引用:

xmlns:cc11="clr-namespace:C1.Win.FlexViewer;assembly=C1.Win.FlexViewer.4"

在佈局中新增可供報表預覽的控制元件

<Grid>
        <wfi:WindowsFormsHost>
            <cc11:C1FlexViewerPane   x:Name="flexViewerPane"  ></cc11:C1FlexViewerPane>
        </wfi:WindowsFormsHost>
    </Grid>

Setp3

我們在後臺載入報表

private C1FlexReport _report;
    public Window1()
    {
        InitializeComponent();

        _report = new C1FlexReport();

        // load report definition from resources
        Assembly asm = Assembly.GetExecutingAssembly();
        using (Stream stream = asm.GetManifestResourceStream("WpfApp1.Resources.FlexCommonTasks.flxr"))
            _report.Load(stream, "Chart2D");

        // assign report to the preview pane
        flexViewerPane.DocumentSource = null;
        flexViewerPane.DocumentSource = _report;
    }

注:切記,這裡面的報表是Winform平臺下的

到這一步,我們工作完成了一大半,還差最後一步點石成金的步驟。很多人以為在這就結束了,但是我們要考慮 ComponentOne License 授權的問題,如何把Winform 的授權在WPF下注冊,其實很簡單,因為 .NET 的license機制一樣,我們只需用同樣的方式去註冊控制元件的license ,不過這裡推薦手動註冊,這很重要,因為一不小心,就會報lc.exe=-1的錯誤

這裡我們都用到了

  • C1FlexViewerPane
  • C1FlexReport

所以我們在license檔案中寫如下注冊資訊

C1.Win.FlexReport.C1FlexReport, C1.Win.FlexReport.4 C1.Win.FlexViewer.C1FlexViewerPane, C1.Win.FlexViewer.4

至此,我們就大功告成了。

示例原始碼下載

本文中的示例原始碼,請點選此處下載

關於葡萄城

賦能開發者!葡萄城公司成立於 1980 年,是全球領先的集開發工具、商業智慧解決方案、管理系統設計工具於一身的軟體和服務提供商。西安葡萄城是其在中國的分支機構,面向全球市場提供軟體研發服務,併為中國企業的資訊化提供國際先進的開發工具、軟體和研發諮詢服務。葡萄城的控制元件和軟體產品在國內外屢獲殊榮,在全球被數十萬家企業、學校和政府機構廣泛應用。​