2010-02-10 23 views
6

Tôi hiện đang khám phá tùy chọn chuyển một số ứng dụng VB6 cũ sang WPF bằng C#. Kế hoạch, trong giai đoạn một, là cổng một số hình thức quan trọng và không phải tất cả các ứng dụng. Mục đích lý thuyết là để mở hình thức VB6 trong một container của một số loại trong WPF thông qua một dll ActiveX.Có thể/làm thế nào để bạn lưu trữ một mẫu VB6 đầy đủ trong một ứng dụng C# WPF?

Điều này có thể thực hiện được không? Tôi đã thử nhìn vào Interop và dường như không thể tìm thấy một ví dụ vững chắc về cách làm cho nó làm việc với bất cứ điều gì nhưng điều khiển Win32, không phải là một hình thức đầy đủ. Tôi có toàn quyền truy cập vào mã VB6 cũ và có thể sửa đổi nó trong anyway cần thiết.

Ảnh chụp màn hình sau đây của ứng dụng WPF chính sẽ đóng vai trò như các wrapper/container:

http://www.evocommand.com/junk_delete_me/main_menu_mockup.png

Màn hình bảo trì VB6 hiện tại sẽ được nạp trong “không gian trắng” phần trên bên phải của màn hình trước đó.

Trả lời

11

tôi đã có thể hoàn thành nhiệm vụ với các bước sau:

  1. Tạo một VB6 mới tích cực Dự án Kiểm soát X. Sao chép và dán toàn bộ nội dung của điều khiển biểu mẫu VB6 và mã sau vào điều khiển mới.Có một số yếu tố cần phải được xử lý trong việc chuyển đổi sang một điều khiển:

    1. bạn mất khả năng hiển thị chú thích của hình thức theo cách thức trước . Bạn có thể làm việc xung quanh bằng các điều khiển thay thế (nhãn/borderlesstextbox, v.v.) mà hoàn thành cùng chức năng nếu cần . Đây không phải là ưu tiên kể từ khi mỗi màn hình được lưu trữ trong một trình duyệt như hệ thống tab trong dự án mới .Net mới của chúng tôi.

    2. Tất cả các tài liệu tham khảo mousepointer phải được thay đổi từ Me.Mousepointer để Screen.mousepointer

    3. Bạn không thể sử dụng Me.Hide và phải kiện thay thế để ẩn chứa Net .

    4. Bất kỳ và tất cả các tài liệu tham khảo để nhớ. [Bất cứ điều gì] phải được gỡ bỏ hoặc thay thế bằng UserControl. [Bất cứ điều gì] nếu họ được áp dụng.

    5. Nếu bạn sử dụng bất kỳ chức năng mà tham khảo một [yourcontrol] .Contianer.Property trên một hình thức họ sẽ cần phải được thay đổi để lặp qua các UserControl.Controls bộ sưu tập để thay thế và “container” là không hợp lệ cho vb6 Điều khiển ActiveX

    6. Tất cả các biểu mẫu/hộp thoại không theo phương thức phải được xóa khỏi dự án là hiện tại không có Hwnd để xử lý trong WPF. Bạn gặp lỗi 'Biểu mẫu không phải là phương thức không thể được hiển thị trong máy chủ lưu trữ này ứng dụng từ ActiveX DLL, Điều khiển ActiveX hoặc Trang thuộc tính'. Trong trường hợp của chúng tôi, chúng tôi đã có màn hình giật gân đơn giản sẽ hiển thị khi một số báo cáo/quy trình dài nhất định được hiển thị là để cho người dùng biết điều gì đang chạy.

  2. Tôi không thể trực tiếp thêm điều khiển VB6 qua interop vào dự án WPF. Như một dự án "Thư viện điều khiển biểu mẫu Windows" .Net mới đã được tạo ra. Một tham chiếu đến VB6 OCX đã được thêm vào dự án. Sau đó, các điều khiển VB6 được thêm vào hộp công cụ .Net bằng cách nhấp chuột phải -> “Thêm mục” và trỏ một tham chiếu com vào ocx điều khiển VB6. Điều khiển .Net sau đó được sử dụng để lưu trữ/phục vụ VB6 Control.

  3. Để hiển thị lưu trữ biểu mẫu trong VB6 và kích hoạt chức năng khởi tạo cần thiết, các điều khiển VB6 OCX được mặc định theo kiểu Visible.False để chúng được thêm vào .Net OCX dưới dạng điều khiển vô hình. Khi cần thiết, điều khiển VB6 được thiết lập để hiển thị = True để kích hoạt sự kiện UserControl_Show(). Tất cả mã trước đây trong Form_Load() đã được di chuyển đến sự kiện này. Sự kiện hiển thị là phương pháp dễ nhất để truy cập Form_Load khi cần. MSDN: “Điều khiển không nhận được sự kiện Hiển thị nếu biểu mẫu bị ẩn và sau đó được hiển thị lại hoặc nếu biểu mẫu được thu nhỏ và sau đó được khôi phục. Cửa sổ điều khiển vẫn còn trên biểu mẫu trong các hoạt động này và thuộc tính Có thể nhìn thấy của nó không thay đổi. ”

  4. Gói các điều khiển vb6 trong a.Kiểm soát Winform đã giải quyết vấn đề với nút Radio/Option được hiển thị dưới dạng màu đen như được nêu ở một nơi khác trong một câu trả lời của tôi cho câu hỏi này mà không phải chuyển đổi khung thành hộp Hình ảnh như được đề xuất.

  5. Trong ứng dụng WPF là lựa chọn menu được chọn, mã xaml được tạo động và hiển thị qua trình bao bọc với thẻ WindowsFormsHost. Một đối tượng điều khiển được tạo động từ ứng dụng biểu mẫu .Net sau đó được đẩy vào thẻ WindowsFormsHost trên xaml và điều khiển được hiển thị trên dự án .net khởi động vb6 UserControl_Show và sau đó tải và hiển thị biểu mẫu vb6.

+0

Chà, thật đáng kinh ngạc. –

+0

Chỉ cố gắng để cứu một số linh hồn tội nghiệp của một số vết bầm sọ, từ đập đầu họ, mà tôi đã trải qua trong vài tuần qua làm việc. – jasonk

1

Thậm chí bạn có thể tải biểu mẫu VB6 đó dưới dạng VB6 khác không? Tôi đề nghị bạn nên làm việc đó trước.

+0

Tôi muốn tải biểu mẫu VB6 dưới dạng WPF. – jasonk

+1

@jasonk: Tôi biết bạn muốn làm gì. Tôi đề nghị bạn đầu tiên có được hình thức VB6 nạp trong một hình thức VB6. Khi đã xong, bạn sẽ biết rằng biểu mẫu có thể được tải dưới dạng _some_. _Then_ làm việc để tải nó dưới dạng WPF. Bạn có thể phải thay đổi biểu mẫu để cho phép nó được tải dưới dạng khác. Bạn cũng sẽ làm việc đó trong VB6 mà bạn quen thuộc. –

0

Không có cách nào đáng tin cậy để đặt cha mẹ của biểu mẫu VB6. Bạn luôn có thể hack nó hoặc sử dụng điều khiển ActiveX đơn giản (UserControl trong VB6) làm UI container thay vì VB6 form.

+0

Tôi không quen thuộc với việc xây dựng các điều khiển OCX. Điều đó có nghĩa là mỗi màn hình trong VB6 sẽ phải được kiểm soát riêng của nó hoặc là có một cách để lưu trữ nhiều màn hình trong kiểm soát duy nhất? – jasonk

3

Tôi nghĩ rằng những gì bạn sẽ phải làm là trích xuất nội dung biểu mẫu VB6 vào điều khiển ActiveX. Sau đó bạn có thể phơi bày điều này trong dll ActiveX của bạn và đặt ở dạng WPF của bạn. Tôi nghi ngờ nó có thể lưu trữ một hình thức VB6 trong bất kỳ loại hình thức khác.

+0

+1, mặc dù điều khiển sẽ cần được hiển thị trong ActiveX OCX chứ không phải là tệp DLL. – MarkJ

+0

Tôi không quen thuộc với việc xây dựng các điều khiển OCX. Điều đó có nghĩa là mỗi màn hình trong VB6 sẽ phải được kiểm soát riêng của nó? – jasonk

+1

Có, về cơ bản bạn lấy mọi thứ ra khỏi màn hình và đặt nó trong điều khiển ActiveX. Sau đó, bạn có thể đặt điều khiển này vào biểu mẫu VB6 của bạn (hoặc lưu trữ nó trong ứng dụng .NET của bạn). Tôi chỉ chạy qua bài viết MSDN này có thể giúp bạn. http://msdn.microsoft.com/en-us/library/ms742735.aspx –

0

Tôi đã tìm thấy một phương pháp để thực hiện những gì cần thiết trong WinForms chứ không phải là WPF tại thời điểm này. http://www.codeproject.com/KB/vb-interop/VB6formsinNET.aspx Tôi tính nếu tôi có thể làm cho nó hoạt động 100% ở đó tôi có thể chuyển nó sang WPF hoặc trường hợp xấu hơn lưu trữ phần tử WinForm trong biểu mẫu WPF nếu tôi hoàn toàn có (U-G-L-Y).

Dù sao, tôi đã tiến gần hơn một chút, nhưng có một vấn đề rất kỳ lạ với một số điều khiển vẽ quá màn hình. nút radio/Option được render như rắn đen:

http://www.evocommand.com/junk_delete_me/optionbuttons.png

tôi đã cố gắng thay đổi một cách rõ ràng màu nền của điều khiển từ buttonface đến một màu cố định và nó vẫn hiện nó. Tôi giả định đó là một vấn đề phân tầng với các nút tùy chọn nằm trong điều khiển khung. Tôi đang ở một chút mất mát về làm thế nào để tiến hành mà không cần làm lại lớn của nội dung VB6 để thay đổi các tùy chọn nút để hộp kiểm. Đó là một ứng dụng khổng lồ và có hơn 600 nút điều khiển tùy chọn trên ứng dụng mà tôi không thực sự muốn giải quyết.

EDIT: Tôi có thể xác nhận nó có liên quan đến việc phân lớp tùy chọn trong điều khiển Khung. Nếu kéo ra đến hình thức cơ bản vấn đề này không xảy ra: http://www.evocommand.com/junk_delete_me/optionbuttons2.png

+0

Tìm thấy một cách giải quyết khác nếu bạn đặt OptionButton trong một PictureBox chứ không phải là Frame nó sẽ hiển thị mà không có nền đen. – jasonk

Các vấn đề liên quan