今天實在看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類對於文本內容有着缺省的數據模板,當然你也可以用那四個模板來替換,這樣你就可以以你喜歡的任何方式來格式化文本了。下面這個圖展示了通過斜體和下划線來格式化文本。
//為上面這個圖的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 翻譯,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者博客鏈接,謝謝!