Posts Tagged C#
Kết hợp WPF và Windows Form
WPF là công nghệ mới rất hấp dẫn đối với các nhà lập trình giao diện. So với Windows Form, WPF cung cấp nhiều tính năng đồ họa và multimedia vượt trội. Trong một ứng dụng lý tưởng, chúng ta có thể quên hẳn Windows Form để tập trung vào WPF. Tuy nhiên trong thực tế, Windows Form vẫn chưa chết. Vì sao?
Thứ nhất, Windows Form là một công nghệ ra đời đã khá lâu và ổn định. Đa số các ứng dụng desktop hiện nay đều được xây dựng trên Windows Form. Trong khi đó, WPF chỉ mới xuất hiện được vài năm và nhiều lập trình viên vẫn quen thuộc với Windows Form hơn là WPF.
Thứ hai, WPF dù có nhiều ưu điểm nhưng vẫn chưa thực sự hoàn chỉnh. Một số tính năng của Windows Form (chẳng hạn một số loại control và hộp thoại) hiện vẫn chưa thể tìm thấy trong WPF. Trong những trường hợp đó, sử dụng lại các thành phần của Windows Form cho ứng dụng WPF (thay vì phát triển lại WPF control từ đầu) có thể sẽ là một tùy chọn đáng cân nhắc.
Từ những lý do trên, có thể thấy rằng Windows Form sẽ chưa biến mất ngay. Thay vào đó, các ứng dụng Windows Form có sẵn sẽ được nâng cấp từ từ sang WPF. Điều này làm nảy sinh nhu cầu kết hợp WPF và Windows Form trong cùng một chương trình. Thật may, cả hai công nghệ này có thể sống chung một cách khá dễ dàng! Bài viết này sẽ trình bày một số phương pháp để giải quyết vấn đề trên:
1. Đặt các WPF control và Windows Form control trong các cửa sổ riêng:
Đây là hướng tiếp cận đơn giản nhất, trong đó mỗi cửa sổ sẽ chỉ chứa một loại control (WPF control hoặc Windows Form control). Ta có thể thêm một cửa sổ Windows Form vào một ứng dụng WPF tương tự như đối với một ứng dụng Windows Form thông thường bằng cách click chuột phải vào tên project trong solution explorer, chọn Add -> New Item, sau đó chọn Windows Form trong Windows Form category, đặt tên và click Add.
Ngược lại, thêm một cửa sổ WPF vào một ứng dụng Windows Form hơi rắc rối hơn một chút vì Visual Studio không cung cấp tùy chọn này trong hộp thoại Add New Item. Tuy nhiên, ta có thể import một cửa sổ WPF có sẵn trong một project khác bằng cách chọn Add -> Existing Item và add cả hai file .xaml và .cs của cửa sổ đó. Với cách này, bạn sẽ phải tự add reference tới ba assembly sau: PresentationCore.dll, PresentationFramework.dll và WindowsBase.dll.
Visual Studio sẽ cung cấp môi trường làm việc phù hợp (trình thiết kế, intellisense…) cho mỗi loại cửa sổ. Bạn có thể thiết kế và biên dịch chương trình một cách tự nhiên như trong bất kì ứng dụng WPF hoặc Windows Form nào. Một lưu ý duy nhất là khi cần show một cửa sổ WPF ở dạng modeless từ trong một cửa sổ Windows Form (hoặc ngược lại), cần gọi phương thức EnableModelessKeyboardInterop (hoặc EnableWindowsFormInterop) để đảm bảo cửa sổ modeless có thể nhận keyboard input bình thường. Ví dụ trong trường hợp cửa sổ modeless WPF:
MyWindow window = new MyWindow();
ElementHost.EnableModelessKeyboardInterop(window);
window.Show();
Bạn có thể sẽ cần add reference đến assembly WindowsFormIntegration.dll để sử dụng lớp ElementHost.
2. Đặt WPF control vào cửa sổ Windows Form:
Trong nhiều trường hợp chúng ta buộc phải sử dụng các WPF control và Windows Form control trong cùng một cửa sổ. Lớp ElementHost cho phép đặt các WPF control trong cửa sổ Windows Form. Chỉ cần tạo WPF control mong muốn và đặt nó vào trong ElementHost, sau đó thêm ElementHost vào tập các control của form.
ElementHost host = new ElementHost();
System.Windows.Controls.DatePicker wpfDatePicker = new System.Windows.Controls.DatePicker();
host.Dock = DockStyle.Fill;
host.Child = wpfDatePicker;
this.Controls.Add(host);
3. Đặt Windows Form control vào cửa sổ WPF:
WPF cung cấp lớp WindowsFormHost có thể chứa một Windows Form control trong property Child. Ta có thể sử dụng lớp này theo kiểu khai báo trong XAML hoặc bằng lập trình:
<Grid>
<WindowsFormsHost>
<wf:TextBox x:Name="txtWinForm"/>
</WindowsFormsHost>
</Grid>
để sử dụng được tag <WindowsFormHost> như trên cần thêm dòng khai báo sau vào tag <Window>:
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Còn đây là đoạn code để thêm Windows Form control vào cửa sổ WPF bằng C#:
System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost();
// Create the ListBox control.
System.Windows.Forms.ListBox lstBox = new System.Windows.Forms.ListBox();
lstBox.Items.Add("Item 1");
lstBox.Items.Add("Item 2");
// Assign the ListBox control as the host control's child.
host.Child = lstBox;
// Add the interop host control to the Grid
this.MyGrid.Children.Add(host);
Nhớ rằng bạn cần Add Reference tới assembly System.Windows.Form và WindowsFormIntegration để đoạn code trên hoạt động.
4. Một vài hạn chế khi sử dụng WPF control và Windows Form control trong cùng một cửa sổ:
- Trong nhiều trường hợp, các control của Windows Form không thể thay đổi kích thước hoặc chỉ có thể thay đổi theo một chiều nhất định.
- Các control của Windows Form cũng không thể được xoay hoặc làm nghiêng. Nếu bị áp dụng các hiệu ứng này, WindowsFormHost sẽ phát sinh sự kiện LayoutError, và cuối cùng sẽ gây InvalidOperationException nếu không được xử lý.
Webcam Surveillance System
Posted by worm.NET in Application, C# on Tháng Mười 27, 2010
* Bạn có thể tìm thấy phiên bản giới thiệu tiếng Việt ở bên dưới.
Introduction:
This is a simple video surveillance system that makes use of webcams as recording devices. It provides basic functionalities such as motion detection and alarm, and is designed to be extensible: developers can develop their own sensors and plug into the program. The ability to create source filters creates some interesting effects: the program can be transformed completely into a remote desktop viewer!
This program is written completely in C# and composes of three components:
- Recorder: record video and stream to server
- Server: dispatch video streams to remote clients
- Client: connect to server to view video
Note:
- Recorder uses DirectShow source filter to communicate with webcams. You can create your own source filter for different purposes. Many free source filters are available on the Internet. Consult Directshow documentation for more details on how to create a source filter.
- You can also create custom sensors to match your need. To create custom sensors, implement interface ISensor. All sensors are stored in Sensors folder and loaded dynamically at runtime. Just copy your custom sensor to that folder and it will appear on the sensor list when the program runs.
Requirements:
- To run the program, you will need:
- .NET Framework 4
- To build the projects, you will need these things in addition:
- Visual Studio 2010
- AForge.NET Framework (download at http://www.aforgenet.com/)
- Windows SDK v7.1
- DirectShow.NET (http://directshownet.sourceforge.net/)
- Fluent Ribbon v1.3
This program was tested on Windows XP SP3 and Windows 7 32 bit. It may run on other platform as well.
Known issues:
Due to the complexity of multi-threaded programming and relatively short development time, this program may still contain a lot of bugs. Client may disconnect mysteriously after about 10 minutes. I haven’t found out the reason and currently don’t have the time to fix it. Hope it would be much better on the next release (if any)!!!
Download:
http://wcssystem.codeplex.com/
Project licensed under Apache license 2.0
————————-*****————————-
Giới thiệu:
Đây là hệ thống quan sát từ xa đơn giản tận dụng các webcam làm thiết bị thu hình. Hệ thống cung cấp các chức năng cơ bản như phát hiện chuyển động và báo động, và được thiết kế với khả năng mở rộng. Lập trình viên có thể thiết kế các cảm biến riêng và thêm vào chương trình. Bên cạnh đó, khả năng tạo các source filter đem lại những hiệu ứng thú vị: chương trình có thể chuyển đổi nhanh chóng thành một chương trình xem màn hình desktop từ xa.
Chương trình viết hoàn toàn bằng C# và gồm ba thành phần chính:
- Recorder: thu nhận hình ảnh và truyền tới Server
- Server: tiếp nhận và điều phối hình ảnh đến các client từ xa
- Client: kết nối tới server để xem hình ảnh
Lưu ý:
- Recorder sử dụng các source filter của DirectShow để giao tiếp với webcam. Bạn có thể tạo source filter của riêng mình cho các mục đích khác nhau. Bạn cũng có thể tìm thấy nhiều source filter miễn phí trên Internet. Xem tài liệu DirectShow để biết chi tiết về cách tạo source filter.
- Bạn cũng có thể tạo các sensor riêng cho phù hợp với nhu cầu. Để tạo custom sensor, hiện thực interface ISensor trong chương trình. Tất cả các sensor được chứa trong thư mục Sensors của Recorder và được load động vào thời gian thực thi. Chỉ cần copy sensor của bạn vào thư mục trên và nó sẽ xuất hiện khi chương trình chạy.
Yêu cầu:
- Để chạy chương trình cần có:
- .NET Framework 4
- Để build project, bạn cần thêm những công cụ và thư viện sau:
- Visual Studio 2010
- AForge.NET Framework (download tại http://www.aforgenet.com/)
- Windows SDK v7.1
- DirectShow.NET (http://directshownet.sourceforge.net/)
- Fluent Ribbon v1.3
Chương trình đã được chạy thử trên Windows XP SP3 và Windows 7 32-bit.
Các vấn đề:
Do những phức tạp của lập trình đa luồng và thời gian phát triển ngắn, chương trình có thể còn nhiều lỗi. Một vấn đề đã được biết là client có thể bị ngắt kết nối sau khoảng 10 phút. Hiện tôi chưa có thời gian để khắc phục các vấn đề này, hi vọng rằng chương trình sẽ tốt hơn trong các bản phát hành sau (nếu có)!
Tải về:
http://wcssystem.codeplex.com/
Chương trình đăng kí bản quyền theo Apache License 2.0
