Trên nền tảng Windows CE, Silverlight chỉ hỗ trợ phát triển bằng ngôn ngữ C++. Do đó, không thể sử dụng mã được tạo ra từ công cụ Expression Blend (chỉ sinh mã C# hoặc VB.NET). Thay vào đó, cần xây dựng ứng dụng Win32 thuần túy và tích hợp runtime của Silverlight thông qua các thư viện gốc.
Đầu tiên, bao gồm các header cần thiết:
#include "xamlruntime.h"
#include "xrdelegate.h"
#include "xrptr.h"
Sau đó, liên kết với thư viện runtime:
#pragma comment(lib, "xamlruntime.lib")
Tệp XAML phải được nhúng vào dự án dưới dạng tài nguyên. Các bước thực hiện như sau:
- Mở cửa sổ Resource View, nhấp chuột phải và chọn Add Resource...
- Nhấn nút Import, chọn tệp XAML cần thêm
- Đặt loại tài nguyên là
XAML - Giữ nguyên ID mặc định (ví dụ:
IDR_XAML1) hoặc đặt tên dễ nhớ hơn - Bao gồm
resource.htrong file nguồn để truy cập ID tài nguyên
Ví dụ mã khởi tạo ứng dụng Silverlight hoàn chỉnh:
#include "stdafx.h"
#include "resource.h"
#include "xamlruntime.h"
#include "xrdelegate.h"
#include "xrptr.h"
class ClickHandler {
public:
HRESULT OnButtonClick(IXRDependencyObject* sender, XRMouseButtonEventArgs* e) {
MessageBox(NULL, TEXT("Đã nhấn nút!"), TEXT("Silverlight trên WinCE"), MB_OK);
return S_OK;
}
};
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPTSTR, int) {
if (!XamlRuntimeInitialize())
return -1;
IXRApplicationPtr app;
if (FAILED(GetXRApplicationInstance(&app)))
return -1;
if (FAILED(app->AddResourceModule(hInst)))
return -1;
XRWindowCreateParams winParams = {0};
winParams.Style = WS_OVERLAPPED;
winParams.pTitle = L"Ứng dụng Silverlight";
winParams.Left = winParams.Top = 0;
XRXamlSource xamlSource;
xamlSource.SetResource(hInst, TEXT("XAML"), MAKEINTRESOURCE(IDR_XAML1));
IXRVisualHostPtr visualHost;
if (FAILED(app->CreateHostFromXaml(&xamlSource, &winParams, &visualHost)))
return -1;
IXRFrameworkElementPtr rootElement;
if (FAILED(visualHost->GetRootElement(&rootElement)))
return -1;
IXRButtonBasePtr button;
if (FAILED(rootElement->FindName(TEXT("HelloWorldBtn"), &button)))
return -1;
ClickHandler handler;
IXRDelegate<XRMouseButtonEventArgs>* clickDelegate = nullptr;
if (FAILED(CreateDelegate(&handler, &ClickHandler::OnButtonClick, &clickDelegate)))
return -1;
if (FAILED(button->AddClickEventHandler(clickDelegate)))
return -1;
UINT exitCode;
if (FAILED(visualHost->StartDialog(&exitCode)))
return -1;
clickDelegate->Release();
return 0;
}
Ngoài việc tải giao diện từ XAML, có thể tạo và thêm phần tử UI động trong mã. Ví dụ sau minh họa cách thêm một nút mới vào canvas đã được định nghĩa trong XAML:
#include <windows.h>
#include <XamlRuntime.h>
#include <XRPtr.h>
void AddDynamicButton(IXRApplication* app, IXRVisualHost* host) {
IXRButtonPtr newButton;
app->CreateObject(&newButton);
newButton->SetHeight(6.0f);
newButton->SetWidth(12.0f);
newButton->SetName(L"MyGreenButton");
IXRFrameworkElementPtr root;
host->GetRootElement(&root);
IXRCanvasPtr targetCanvas;
root->FindName(L"MyCanvas", &targetCanvas);
IXRUIElementCollectionPtr children;
targetCanvas->GetChildren(&children);
children->Add(newButton, nullptr);
}