首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

SideShow Gadget 開發實戰 (二):常規 Gadget 與 SCF 協議詳解

     編輯:關於.NET

延續上篇「本地 Gadget」介紹,本文深入剖析常規 Gadget 的架構本質、開發模式與實戰代碼。常規 Gadget 並非下載到裝置運行的 .NET Micro Framework 組件,而是基於 SCF (Simple Content Format) 協議的「網頁應用」模型:PC 端為伺服器輸出 SCF 內容流,SideShow 裝置為客戶端渲染顯示。

架構認知糾偏

  • 錯誤認知:Gadget = 下載到裝置的 DLL/組件,由裝置端運行。
  • 正確模型:Gadget = PC 端應用程式,輸出符合 SCF 格式的 XML 內容流。裝置端僅負責解析渲染 SCF,類似瀏覽器渲染 HTML。
  • 協議支援:SCF (主要)、iCal (行事曆端點)。開發語言不限,只要能輸出 SCF XML 即可,推薦 C#/.NET 使用官方 SDK 類庫。

實戰案例:圖片瀏覽 Gadget

功能展示

  1. 控制面板圖示與名稱顯示
  2. 屬性頁:設定共享圖片目錄
  3. 裝置端:圖片縮圖列表、全螢幕瀏覽、左右鍵翻頁、主選單/右鍵選單導航

控制面板圖示 屬性頁設定 裝置端列表 左右鍵翻頁 ListBox 選擇

核心代碼解析

1. 兩個 GUID 識別碼

  • GadgetId:Gadget 本體識別,平台用此載入對應內容。
  • PropertyPageId:屬性頁識別,繼承 Microsoft.SideShow.GadgetPropertyPage,平台用此顯示設定對話框。

註冊需管理員權限 (VS2008 以管理員身份運行),否則寫入註冊表失敗。

2. 註冊代碼

GadgetRegistration.Register(
    false,                              // false=當前用戶, true=所有用戶
    GadgetId,                           // Gadget GUID
    ScfSideShowGadget.ScfEndpointId,    // 使用 SCF 端點
    "Picture Share",                    // 控制面板顯示名稱
    Assembly.GetEntryAssembly().Location, // 程式路徑
    String.Format("\"{0}\",{1}", Assembly.GetEntryAssembly().Location, -GadgetRegistration.DefaultIconResourceId), // 圖示
    false,                              // false=無需連線也顯示內容
    GadgetCachePolicies.KeepNewest,     // 快取策略:保留最新
    new Guid("9B84055E-E253-4119-8719-F684ECB9FBC1") // 屬性頁 GUID
);

3. 事件訂閱

YFGadget = new ScfSideShowGadget(new Guid(GadgetEntry.Gadget_GUID));

// 核心事件
YFGadget.ContentMissing += OnContentMissing;       // 裝置請求內容 (核心:動態生成 SCF)
YFGadget.ContentNavigate += OnContentNavigate;     // 導航操作 (翻頁、選單)
YFGadget.ContextMenuSelect += OnContextMenuSelect; // 右鍵選單
YFGadget.MenuSelect += OnMenuSelect;               // 選單項選擇
YFGadget.DeviceAdded += OnDeviceAdded;             // 裝置連接
YFGadget.DeviceRemoved += OnDeviceRemoved;         // 裝置斷開
YFGadget.GadgetEnter += OnGadgetEnter;             // 進入 Gadget
YFGadget.GadgetExit += OnGadgetExit;               // 退出 Gadget
YFGadget.AllDevicesRemoved += OnAllDevicesRemoved; // 所有裝置移除

4. 動態生成 SCF 內容 (核心邏輯)

// 1. 掃描圖片目錄
string[] files = Directory.GetFiles(SharePath);
List<string> imgFiles = files.Where(f => 
    new[] { ".jpg", ".bmp", ".gif" }.Contains(Path.GetExtension(f).ToLower())).ToList();

List<ScfElement> menuItems = new List<ScfElement>();

for (int i = 0; i < imgFiles.Count; i++) {
    FileInfo fi = new FileInfo(imgFiles[i]);
    Bitmap bmp = new Bitmap(fi.FullName);
    
    int pageNo = i + 1;           // 內容 ID: 頁面
    int picNo = 10000 + i + 1;    // 內容 ID: 圖片
    
    // 縮放並減色深適配裝置螢幕
    bmp = new Bitmap(bmp, 240, (int)(240 * ((float)bmp.Height / bmp.Width)));
    YFGadget.AddContent(picNo, ImageContentTransforms.ReduceColorDepth, bmp);

    // 構建頁面 SCF 元素
    ScfElement page = Scf.Content(
        pageNo, fi.Name, 200,                    // ID, 標題, 選單關聯 ID
        Scf.Img(picNo, ScfAlign.Center, ScfImageFit.Native, fi.Name), // 圖片
        Scf.Txt(ScfAlign.Center, false, Color.Black, "", $"<< {pageNo}/{imgFiles.Count} >>"), // 頁碼文字
        Scf.Btn(DeviceButton.Left, "", pageNo == 1 ? imgFiles.Count : pageNo - 1), // 上一頁
        Scf.Btn(DeviceButton.Right, "", pageNo == imgFiles.Count ? 1 : pageNo + 1), // 下一頁
        Scf.Btn(DeviceButton.Back, "", 100)      // 返回主選單
    );
    
    menuItems.Add(Scf.Item(pageNo, fi.Name)); // 主選單項
    YFGadget.AddContent(page);
    bmp.Dispose();
}

// 2. 添加主選單與右鍵選單
YFGadget.AddContent(Scf.Menu(100, "Main Menu", ScfSelectAction.Target, menuItems.ToArray()));
YFGadget.AddContent(Scf.Menu(200, "Right Menu", ScfSelectAction.Target, Scf.Item(100, "主選單")));

關鍵技術點總結

  1. 內容推送模型:AddContent 將 SCF 元素推送到平台快取,裝置按需拉取。ContentMissing 事件中動態生成內容可節省記憶體。
  2. 圖片預處理:ImageContentTransforms.ReduceColorDepth 自動適配裝置顏色深度;KeepAspectRatio 可選保持比例。
  3. 導航邏輯:透過 Scf.Btn 綁定硬體按鍵 (Left/Right/Back) 到目標內容 ID,實現無程式碼導航。
  4. 選單結構:Scf.Menu 定義選單,Scf.Item 定義選單項目標題與目標內容 ID。
  5. SDK 封裝優勢:Microsoft.SideShow.SimpleContentFormat.Scf 靜態類提供流暢 API,避免手寫 XML。

開發建議

  • 大量圖片時考慮分頁載入,避免 ContentMissing 事件阻塞 UI 線程。
  • 實作 IDisposable 正確釋放 Bitmap 等非托管資源。
  • 測試多裝置場景:同一 Gadget 實例可能服務多台裝置,內容生成需無狀態或按裝置隔離。
  • SideShow 平台已隨 Windows 7 之後版本淘汰,現代替代方案請參考 UWP 應用 + 投影/次螢幕 API。

完整原始碼可留言交流。理解 SCF 內容流模型是掌握常規 Gadget 開發的鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved