【原譯】一個可定制的WPF任務對話框


今天實在看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 翻譯,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者博客鏈接,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM