2011年4月30日 星期六

Silverlight ComboBox的Hotkey功能

最近在做專案時,客戶問到操作界面的問題,希望ComboBox能夠有hotkey,這種需求是很難拒絕的,特別是很久以前的WinForm早就有這種功能了。

但不幸的是,Silverlight...沒有。沒有的原因是Silverlight的ComboBox比較強(嗯...好怪的邏輯唷),不過,是真的,因為Silverlight的ListBox和ComboBox裡面的item並不像是以前WinForm or WebForm只能是ListBoxItem, 現在Silverlight中的ComboBox的Item,可以是任何物件,例如簡單一點的String, 複雜一點的Calendar, 甚至可以讓每一個Item是多個物件的集合。

不過,這是ComboBox比較複雜且加上DataBinding的用法,那...假設ComboBox中的Items,根本就是很單純的ComboBoxItem或是String呢? 難道還是不能用HotKey嗎?

然而這時候,可能就需要寫段小程式了,去Hook ComboBox的KeyUp事件,在按下特定的字母時,將ComboBox的SelectIndex做動態的調整,要寫Code,不麻煩,但要能reuse就需要花點腦筋了。

不過令人興奮的是,Silverlight的Behavior技術,可以把這個功能封裝成可重複使用的原件,那,就設計成Behavoir好了...

不過正準備動手時,轉念一想,這麼常用的功能不可能沒有吧,Search了一下,果不其然,國外已經有寫好的套件囉,而且還含有Source Code呢...網址如下...
http://gallery.expression.microsoft.com/RapidAccessKey

Enjoy it...


分享

2011年4月28日 星期四

C# 101 - Cancel Event的設計

最近上課時,學員問到C#當中Event的設計,主要是希望能夠設計出類似WinForm視窗關閉時,那個帶有Cancel屬性的e參數,為此,該學員傷腦筋了很久。

為了避免學員內心受創,因此我緩緩地先述說了一段事件設計的歷史故事,成功轉移焦點後,再委婉告訴他其實不用設計,因為.NET從2.0開始就有了,直接繼承CancelEventArgs 類別即可。

程式碼如下:
public class MyEventArgs : System.ComponentModel.CancelEventArgs
{
//你可以加上其他你需要的屬性
public string AnotherProperty { get; set; }
}

而使用該參數時,只需要撰寫類似底下這樣的事件程式碼:

public delegate void MyActionEventHandler(object sender, MyEventArgs e);
public event MyActionEventHandler MyAction; 

這樣設計出來的事件,在使用參數時就會具有e.Cancel屬性,而在我們觸發該事件的程式碼中,就可以透過底下這樣的Code, 來依照Cancel的值判斷是否要繼續後面的程式碼(這就是我們在WinForm的Closing事件中將屬性e.Cancel設為true之後,就不會關閉視窗的原因)...

if (MyAction != null)
 {
     MyEventArgs arg = new MyEventArgs();
     MyAction.Invoke(this, arg);
     if (arg.Cancel) { return; }
     ...其他程式碼...
  }

其實整個很簡單,但令人訝異的是,許多.NET Developer由於並不常寫Class,導致對.NET內建的許多類別異常的不熟悉。

已經很久沒有機會和學員討論到基礎的東西了,頗令我感慨的是,學員對MVC有興趣,對MVVM有好奇,但由於網路資訊的普及,已經不多Developer,還願意花時間把Programing 101的書籍翻開來好好閱讀了...網路上資訊確實很多,但由於都較為片段,不容易有系統的學習,容易使得開發人員的觀念2266。

可是,我很想跟學員說,其實你知道嗎? 扎實的基礎,才是能夠在職場中站穩腳步的關鍵要素。

分享

2011年4月22日 星期五

技術並非唯一的解決方案

投入資訊業到現在,已經數不清多少個年頭了,在這十幾二十年的歲月中,有幸在不同的時間擔任不同的角色,因此格外能夠體會技術人員的心情。

最近有機會到一些場合進行教育訓練,講授的是微軟新的雲端運算技術以及Silverlight開發技術,其中涉及n-tier概念以及物件導向程式設計,學員來自四面八方,很特別的背景,唯一的共同點就是都並非科班出身(詭異了,那資工資管畢業的人哪去了?),而技術歷史更是迥異,有ASP開發人員、有ASP.NET開發人員、Java開發人員、VB開發人員....etc...

原諒我這麼說,談到ORM、Class Design、Pattern等概念時,java背景的開發人員頻頻微笑點頭,顯然頗有認同之意,而大部分只寫過ASP.NET的WebForm開發人員似懂非懂,能夠抓到一個大概,但不太明白中間的道理和背後的原因,為何程式碼的需要延展性,如何提高重用性,為何要把這個機制設計成類別...似乎有些問號在腦袋裡...

其中有位ASP開發人員則在第一天中午就離開,跟我說,老師您講得很好,但是這些新技術我應該用不到,下回需要時再來請教您...

其實,這些路我都走過,我完全可以理解。(請相信我,這完全沒有對錯,上面這樣寫,跟開發人員的背景無關,其中也完全沒有任何的價值判斷)

我們這一票從Apple II/DOS時代開始寫程式的老人(不然,我要寫壯年嗎? XD) 我深深知道當年從ASP轉換到ASP.NET乃至於把程式改寫成n-tier架構的痛苦,但這麼多年下來,我也大約領略到了背後的甘甜,不過不同的是,我不再辯解,也不強調採用新架構開發系統的優點,每個人(每家公司)都有自己的路,即便不學新東西,也能找到自己的一條生路。

學習成本對每一個人來說是不同的,隨著年紀越長,我越來越少強調競爭力,畢竟電腦科技是應用科技,能產出結果、派上用場最重要,至於開發成本就見仁見智了。

在前一陣子受朋友之託,到一家非常大的企業,幫朋友看一個資訊系統。

主要是這樣,因為這個單位的資訊人員非常忙,這位朋友在部門中委託資訊單位建置了一個簡單的小系統,就是資料輸入和查詢,頂多加上一點分析,但系統建置完成之後,一開始可以用,不過久了之後想要做些調整,資訊單位卻遲遲無法配合,朋友明白這也並非IT人員的錯,因為工作量實在太大,救火都來不及了還改系統???

我最近看到太多這樣的例子,最後企業中的部門獨立把系統外包,但這又造成了資訊單位頭疼的困擾,莫名其妙生出來的系統,該怎麼整合,要如何管理,資訊安全又是另一個衍生出的問題...

我在IT/MIS部門待過很多年,我是教育訓練講師,我也是軟體廠商,我實在看過太多這樣的狀況,這也是目前台灣資訊產業的生態,甚至也是軟體公司在夾縫中生存的空隙之一,這類的資訊系統,在越大的企業中越容易發現,不僅IT單位不知道這個委外系統的存在,變成管理的漏洞,甚至某些由IT自行開發的系統隨著人事變遷也成為了孤兒...

到底,針對這些系統要如何管理,在資訊化已經那麼成熟的今天,要如何去維護和確保系統能正常運作,資訊單位到底該集權管理還是成為企業委外資訊系統的窗口?

最近看了六七家廠商這樣的問題之後,不由得感慨橫生,我沒有辦法在這一篇文章中給大家一個高明的解決方案,我卻有點遺憾,這麼多年過去,技術翻了豈止兩三翻,但企業所面對的問題依舊是這樣,解決方案是喊的震天價響的雲端運算? 時髦的平板或行動通訊裝置能否幫得上忙,還是20年後,這些問題依舊存在???

當年的我的讀者,如果還沒退役,還是IT產業線上的一員,現在也慢慢成為企業中的中階主管,開始掌握資訊化決策權,在我們下的每一個決策裡面,除了技術考量,還有很多管理上的因素需要注意,慢慢地您會發現,IT技術可能不是唯一的解決方案。

分享