許多軟體都是在處理一個文件類型的資料,當然,這個“文檔”不僅限於文字檔。比如二進位編輯器可以處理原始位元據,Office可以處理複雜的辦公文檔等。雖然文檔本身的內容會不同,但是整個文檔處理的方式都是有非常大的重合的。因此建立了一個叫DocLogic的類型,他把此類文檔處理的相似邏輯進行封裝。它具有如下此類文檔處理常式的常用功能支援:
- 定義方法和WPF命令來進行建立,開啟,儲存和另存新檔功能。
- 開啟,儲存對話方塊的執行。
- 對未儲存文檔的覺察和提示(包括視窗關閉時提示使用者儲存檔案)。
- 拖放的支援(使用者將檔案拖放給程式會嘗試開啟這個檔案)。
- 所有操作的錯誤輸出。
- 將命令綁定到WPF預定義命令中(按Ctrl+O會執行開啟操作,按Ctrl+S會執行儲存操作,按Ctrl+N會執行建立操作)。
在樣本程式裡,使用這個類型可以快速建立一個很簡單的記事本程式:
當然,處理的檔案不限於文字檔,我在海棠果工程式控制制台和編輯器中都使用這個類型。
使用DocLogic,使用者必須執行它的抽象方法,就比如最簡單的操作文本的DocLogic,我們來看樣本記事本程式的DocLogic衍生類別 - TxtDocLogic的代碼:
//繼承自DocLogic類型
//DocLogic繼承自Mgen Fx17工程中的LogicBase類型(代表ViewModel基類)。
public class TxtDocLogic : DocLogic
{
//內容是文本
//注意1:屬性本身是INotifyPropertyChanged的,因為介面上是用綁定來擷取資料的。
//注意2:屬性改變後需要調用DocLogic.NotifyContentChanged方法,這樣提示DocLogic文檔已改變。
private string _Content = null;
public string Content
{
get { return _Content; }
set { RaisePropertyChangedEx(ref _Content, value, () => NotifyContentChanged()); }
}
//******** 實現返回語言文本相關的方法 ********
//返回開啟檔案對話方塊的Filter。
protected override string GetOpenFileFilter()
{
return IDOM.FilterOpen;
}
//返回儲存檔案對話方塊的Filter。
protected override string GetSaveFileFilter()
{
return IDOM.FilterSave;
}
//返迴文檔未儲存的提示文本。
protected override string GetSaveDialogContent()
{
return IDOM.DocSaveCheck;
}
//清空內容的執行。(發生在使用者選擇建立命令後)
protected override void ResetContent()
{
Content = null;
}
//判斷內容是否為空白的執行。
protected override bool IsContentEmpty()
{
return Content.IsNullOrEmpty();
}
//從檔案中讀取內容的執行。
protected override void ReadFromDiskOverride(string path)
{
Content = File.ReadAllText(path, Encoding.Default);
}
//將內容寫入到檔案中的執行。
protected override void WriteToDiskOverride(string path)
{
File.WriteAllText(path, Content ?? String.Empty, Encoding.Default);
}
}
好了,有了DocLogic,主邏輯的代碼就是這麼多。接下來需要做的就是定義介面和處理介面上的其他問題。
介面的定義非常簡單,讀者可以參考下原始碼,只需要把實現的DocLogic的內容和命令綁定到介面上就可以了。DocLogic還提供FilePath屬性返迴文件路徑,HasFile屬性返回是否編輯已開啟的檔案,以及IsContentChanged屬性返迴文件內容是否被改變。
對於命令綁定,DocLogic的四大操作直接定義在四個ICommand屬性中:
同時使用者也可以直接調用DocLogic的New,Open,Save和SaveAs方法來完成上述ICommand定義的執行功能。
最後就是介面上其他問題的處理,比如上面講的拖放支援,表單關閉後提示未儲存檔案的支援,和綁定到WPF預定義命令的支援。這些問題之前都其實寫過文章,讀者可以直接參考:
WPF:附加屬性解決MVVM中Window的Closing事件和ViewModel的串連
WPF:MVVM中將預定義命令綁定到ViewModel中的命令中
WPF:附加屬性來解決MVVM中的拖放操作
各版本的原始碼下載
下載頁面
注意:連結是微軟SkyDrive頁面,下載時請用瀏覽器直接下載,用某些下載工具可能無法下載
原始碼環境:Microsoft Visual Studio Express 2012 for Windows Desktop
注意:原始碼不包含引用的外部類庫檔案:Mgen Fx17工程 3.2