今天實在看WPF揭秘的時候看到TaskDialog這個控制項的。然後就去找了一下開源的代碼。在codeproject上發現了這個,非常給力。。另外codeproject改版後很漂亮哦。
介紹:
這是用WPF實現Vista上TaskDialog效果的代碼。
Messagbox訊息框
通過調用重寫的靜態Show方法。TaskDialog就會表現的像一個Messagebox。他有四個文本類型的屬性:Header(頭部), Content(內容), Detail(更多), 和 Footer(底部),其實Detail是一個摺疊的地區, 而Header和Footer還有一個icon屬性(HeaderIcon和FooterIcon),除此之外,Header還有Background(背景)和Foreground(前景)屬性
// TaskDialog.Show方法簽名publicstaticTaskDialogResult Show( stringtitle, stringheader, stringcontent, stringdetail, stringfooter, TaskDialogButton button, TaskDialogResult defaultResult, TaskDialogIcon headerIcon, TaskDialogIcon footerIcon, Brush headerBackground, Brush headerForeground) // TaskDialog.Show 方法的一個例子TaskDialog.Show("Task Dialog 測試", "訊息框的標題文字", "訊息框的內容部分. "+ " 可以自適應內容.", "訊息框的細節部分 "+ "可以自適應內容", "訊息框的底部.", TaskDialogButton.Ok, TaskDialogResult.None, TaskDialogIcon.Information, TaskDialogIcon.Shield, Brushes.White, Brushes.Navy);
定製TaskDialog
使用靜態Show方法。Header, Content, Detail, 和Footer 就限制了只能傳遞字串作為值了。
為了定義這個對話方塊,你先建立TaskDialog類的一個對象,然後分別設定一下各個屬性,最後調用Show方法就可以了
// TaskDialog 執行個體化例子TaskDialog dialog=newTaskDialog();dialog.Title="TaskDialog example";dialog.HeaderIcon=TaskDialogIcon.Warning;dialog.SystemSound=TaskDialogSound.Exclamation;// header 屬性設定dialog.Header="This is the Header.";dialog.HeaderBackground=Brushes.DarkGray;dialog.HeaderForeground=Brushes.White;// Content, Detail 和 Footer屬性設定dialog.Content="This is the content";dialog.Detail="This is the detail";dialog.Footer="this is the Footer";dialog.Show();
TaskDialog控制項派生自HeaderedContentControl類,因為從HeaderedContentControl類可以獲得Header和Content屬性,TaskDialog僅僅是添加了Detail和Footer屬性,這些屬性是Object類型,並且有他們自己的template(模板)屬性HeaderTemplate, ContentTemplate, DetailTemplate, 和 FooterTemplate),TaskDialog類對於常值內容有著預設的資料範本,當然你也可以用那四個模板來替換,這樣你就可以以你喜歡的任何方式來格式化文本了。下面這個圖展示了通過斜體和底線來格式化文本。
圖2
//為上面這個圖的content屬性的 DataTemplate 模板<DataTemplatex:Key="_customContentDataTemplate"> <TextBlock Text="{Binding Content, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Controls:TaskDialog}}}" FontStyle="Italic" TextDecorations="Underline" TextWrapping="Wrap"/></DataTemplate>
因為Header,Content,Detail和Footer是object類型,因此不再受到只能是文本的限制了,你可以防止你喜歡的任何類型到TaskDialog,下面這個例子中的TaskDialog是不是很像UAC的提示呢。這裡Content屬性是一個UserControl類型,放置了一個圖片和一些文本還有兩個CommandButtons(都是普通的按鈕。。不過添加了一些定製的樣式,再加了Header屬性)
圖三
一個類比vista的檔案拷貝視窗的TaskDialog。。
圖四
額外的一些有意思的屬性
下面是TaskDialog暴露的屬性列表(按字母表排序)
Button1Text: string類型,當TaskDialogButton屬性被設定為Custom的時候,用來設定按鈕的文字
Button2Text: 同上
Button3Text: 同上
DefaultResult: TaskDialogResult類型. 設定預設的按鈕
IsButton1Enabled: bool類型. 擷取或設定按鈕的Enabled狀態
IsButton2Enabled: 同上
IsButton3Enabled: 同上
IsCloseButtonEnabled: bool類型. 擷取或設定視窗關閉按鈕的Enabled狀態 (預設為false)
IsExpanded: bool類型,擷取或是設定Detail部分的可見度。
IsModal: bool類型,擷取或是設定對話方塊是不是模態的
ShowInTaskBar: bool類型,擷取或是設定對話方塊是不是顯示在工作列中
SystemSound: TaskDialogSound類型. 設定當對話方塊顯示的時候播放的聲音
TaskDialogButton: TaskDialogButton類型. 顯示在對話方塊上的按鈕可以是None, Ok, OkCancel, YesNo, YesNoCancel, or Custom (查看上面提到的按鈕設定)
Title: string類型,對話方塊的標題
ToggleButtonTexts: TaskDialogToggleButtonTexts提供了兩個屬性來設定toggle按鈕的這個屬性,當toggle 按鈕摺疊或是展開的時候 (預設是’Show Details’ 和’Hide Details’).
TopMost: 設定對話方塊是否置頂
Demo
下載TaskDialog例子,查看Window1.xaml中按鈕的單擊事件,來看TaskDialog是如何被建立的。。
著作權:本文,包括原始碼和檔案,在CPOL下授權。
原文地址:A-Customizable-WPF-TaskDialog
著作權聲明:本文由http://leaver.me 翻譯,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者部落格連結,謝謝!