司道光
【摘 要】WPF為Windows Presentation Foundation縮寫 ,是微軟新一代圖形系統,運行在.NET Framework 3.0架構下,為用戶界面、2D/3D 圖形、文檔和媒體提供統一的描述和操作方法。基于WPF技術雷達動畫設計,動畫演變時間進度與軟件節點狀態同步響應設計,可實現雷達掃描實時性。異步方式節點狀態監測,利用線程獨立于雷達進程運行,為其提供后臺監測服務,完成對雷達節點數據轉換要求。
【關鍵詞】WPF,XAML語言 雷達模型 動畫
1 WPF技術簡介
基于DirectX 9/10技術的WPF不僅帶來前所未有的3D界面,且其圖形向量渲染引擎也大大改進傳統2D界面,如Vista中半透明效果窗體等都得益于WPF。 WPF相對于Windows客戶端開發來說,向前跨出很大一步,它提供了超豐富的.NET UI 框架,集成矢量圖形,豐富流動文字支持flow text support,3D視覺效果和強大無比的控件模型框架。
2 WPF技術雷達實現
XAML標記語言是WPF技術特色,設計人員利用它能構建絢麗多彩UI界面。實際開發中,設計人員利用Microsoft Expression Blend 工具來設計界面,并生成XAML用戶界面,下面例子是利用XAML構建雷達模型,實現雷達動畫,利用C#語言完成監控業務邏輯,實現C#與XAML語言完美結合,為用戶創建震撼效果的雷達監控功能。本案例使用了Mircosoft Visual Studio.NET 2008開發工具和Microsoft Expression Blend 2設計工具,采用C/S架構模式,使用C#語言和Xaml語言。
2.1 雷達監控功能描述
雷達圖的圖形界面分三個區域:區一表示業務系統運行正常;區二表示業務系統部分關鍵指標出現告警,系統運行受到影響;區三表示業務系統關鍵指標不可用,系統運行不可用;各系統監測狀態主要通過探針服務器直接進行可用性探測,并參考各業務核心關鍵指標,各系統圖標依據以上三種狀態進行顏色變化。當某個系統出現問題后(區域二或區域三)進行告警,據問題嚴重程度排序顯示。并展示各業務系統運行狀態統計圖。
2.2 雷達建模
這里主要使用Expression Blend工具來生成XAML語言雷達模型,設計時將Canvas元素作為模型容器,內部使用大小不同Ellipse元素,轉換成路徑,通過漸變填充構建出雷達效果背景。
2.3 雷達動畫驅動
創建雷達動畫,動畫主要針對上述指針模型,圍繞雷達中心點,周而復始進行360度旋轉。下面代碼是雷達動畫故事版代碼,每一圈動畫速率為10秒。
//加載雷達故事板Story = (Storyboard)this.Resources["EllipseAnimation"];
//觸發時間線過度事件Story.CurrentTimeInvalidated += new EventHandler(story_CurrentTimeInvalidated);Story.Begin();
2.4 雷達掃描同步
雷達掃描同步是動畫演變時間進度與軟件節點狀態同步響應設計,利用Storyboard類中故事板對象CurrentTimeInvalidated事件,實現掃描進度與實際監控狀態響應同步。
///節點狀態同步監測服務類PCTK.App_Code.SystemSoftAnimation Syssoft;
//時間線事件 void story_CurrentTimeInvalidated(object sender, EventArgs e){Clock myClock = (Clock)sender; if (myClock.CurrentTime != null)
double TotalSeconds =Math.Round(myClock.CurrentTime.Value.TotalMilliseconds, 4);
CountAnimation = (int)TotalSeconds / 10000;
double NowIndex = Math.Round((TotalSeconds - CountAnimation * 10000) / avgtime, 4);Syssoft.SetSoftState(NowIndex); Syssoft.SetSoftXY(); }}
2.5 節點狀態異步監測
節點狀態監測主要是獨立于雷達動畫進程節點狀態監測,是雷達中表現的被監控對象。在本案例中節點是各應用系統,用獨立線程從中間庫提取應用系統運行狀態, Thread DataServiceProcess = new Thread(new ThreadStart(GetState)); // GetState狀態檢測過程DataServiceProcess.IsBackground = true;DataServiceProcess.Start();
在本案例中自定義了節點狀態監測服務類NodeDataService 主要完成節點狀態監測和節點分布變化邏輯,是雷達監控業務核心邏輯,通過動畫演變引發時間線事件,來調用內部方法,實現雷達掃描狀態實時變化。本案例中還構建一個節點Model對象類,并在NodeDataService 類中定義了該對象泛型集合,實現監控進程與動畫UI進程數據通信。
2.6 節點分布
節點分布是雷達中為各應用系統生成的標點,即圖標,圖標據系統狀態進行顏色變化及區域跳轉,所有標點在雷達圓中按排列規則計算標點坐標,實現均勻分布。
double iangle = Math.Round(n * angle, 3);
///采用三角計算公式 勾股定理,角度正弦值求標點的半徑長度
Point p = new Point(); if (iangle <= 90){p.X = AVGP + Math.Round(dc * Math.Sin(iangle * (Math.PI / 180)), 2) - widths / 2; p.Y = AVGP - Math.Round(dc * Math.Sin((90 - iangle) * (Math.PI / 180)), 2) - 12;}
else{if (iangle <= 180){ p.X = AVGP + Math.Round(dc * Math.Sin((180 - iangle) * (Math.PI / 180)), 4) - widths / 2; p.Y = AVGP + Math.Round(dc * Math.Sin((90 - (180 - iangle)) * (Math.PI / 180)), 2) - 12; }
else{if (iangle <= 270){
p.X = AVGP - Math.Round(dc * Math.Sin((iangle - 180) * (Math.PI / 180)), 2) - widths / 2;
p.Y = AVGP + Math.Round(dc * Math.Sin((270 - iangle) * (Math.PI / 180)), 2) - 12; }
else{if (iangle <= 360) {
p.X = AVGP - Math.Round(dc * Math.Sin((90 - (iangle - 270)) * (Math.PI / 180)), 2) - widths ;
p.Y = AVGP - Math.Round(dc * Math.Sin((90 - (360 - iangle)) * (Math.PI / 180)), 2) - 12;
}return p;}