1. 程式人生 > >WPF全域性視窗錯誤提示框

WPF全域性視窗錯誤提示框

不管是CS還是BS,在需要使用者提交資料的頁面上,總是要做一些校驗,如果校驗有錯就要給使用者提示,WPF裡自然也避免不了這個問題。一開始,我是在視窗上預留了一個TextBlock,並且設定其Visibility=Collapsed,當校驗有錯的時候,再把這個TextBlock顯示出來,這樣做是可以實現既定需求,但是這樣卻會影響整個視窗的佈局,以下圖舉個例子:
這裡寫圖片描述
現在這個TextBlock隱藏在輸入框和搜尋按鈕之間,大家知道Visibility=Collapsed是不佔佈局的,一旦我將Visibility設成了Visible,搜尋按鈕將會往下移動,這樣的體驗顯然不好;有的同學要說了,那初始時設定Visibility=Hidden好了,這個是佔佈局的,這樣按鈕不會下移,的確,按鈕是不會下移了,但是這裡莫名其妙空白一塊也是影響美觀的吧。

我們平時見多了APP中或者H5中的頁面中央一塊黑色背景的提示,這種體驗還是比較好的,那在WPF裡也實現一個吧~
思路很簡單,在每個窗口布局裡最外層Grid裡與內容快平級放置一個上下左右都居中的框就可以了,然後依照實際情況控制這個框的Visibility屬性。顯然,這樣會有不少的工作量,尤其是專案裡視窗比較多的時候。再想想,對,我們要搞一個視窗模板,讓有需要的視窗使用這個模板就行了。
新建一個資源字典VcreditWindowWithAlert.xaml,程式碼如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ControlTemplate x:Key="CustomAlertWindowTemplete" TargetType="Window"> <Border BorderBrush="Transparent" BorderThickness="12" x:Name="outBorder"> <Border.Effect> <DropShadowEffect
BlurRadius="15" Color="#000000" Opacity=".25" Direction="90" ShadowDepth="1"/>
</Border.Effect> <Grid Background="White"> <AdornerDecorator> <ContentPresenter></ContentPresenter> </AdornerDecorator> <Border x:Name="alertBorder" Visibility="Collapsed" Background="#82000000" CornerRadius="8" Padding="6" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="24" MaxWidth="300"> <TextBlock x:Name="alertText" TextWrapping="Wrap" Foreground="White" VerticalAlignment="Center"></TextBlock> <Border.Resources> <Storyboard x:Key="alertStoryboard"> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="alertBorder" Storyboard.TargetProperty="Visibility" Duration="0:0:4"> <ObjectAnimationUsingKeyFrames.KeyFrames> <DiscreteObjectKeyFrame KeyTime="0:0:0" > <DiscreteObjectKeyFrame.Value> <Visibility>Visible</Visibility> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> <DiscreteObjectKeyFrame KeyTime="0:0:4" > <DiscreteObjectKeyFrame.Value> <Visibility>Collapsed</Visibility> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames.KeyFrames> </ObjectAnimationUsingKeyFrames> </Storyboard> </Border.Resources> </Border> </Grid> </Border> </ControlTemplate> <Style x:Key="CustomAlertWindow" TargetType="Window"> <Setter Property="AllowsTransparency" Value="True"/> <Setter Property="WindowStyle" Value="None"/> <Setter Property="Template" Value="{StaticResource CustomAlertWindowTemplete}"> </Setter> </Style> </ResourceDictionary>

稍微解釋一下上面程式碼,可以看到,還是在Grid裡與ContentPresenter內容塊平級放置了一個Border,這個Border裡放置我們要顯示的錯誤資訊,並且我們通過一個動畫5秒後自動關閉這個錯誤提示,另外還設定了Border的MaxWidth=”300”,是為了防止視窗較長時,這個Border會過分長。

那麼,我們怎麼使用上面這個模板呢,首先在App.xaml裡要引入一下:

<ResourceDictionary Source="Resources/VcreditWindowWithAlert.xaml"/>

然後在需要使用的窗口裡,通過Style屬性引用模板:

Style="{StaticResource CustomAlertWindow}"

當需要提示錯誤的時候,我們通過程式碼找到那個動畫,並且Begin它。以下是我寫的一個通用方法,你可以在各個已經引入模板的窗口裡呼叫它:

public static void ShowAlert(Window win, string msg)
{
            ControlTemplate customWindowTemplate = App.Current.Resources["CustomAlertWindowTemplete"] as ControlTemplate;
            if (customWindowTemplate!=null)
            {
                var border = customWindowTemplate.FindName("alertBorder",win) as Border;
                if (border != null)
                {
                    var textblock = border.FindChild<TextBlock>("alertText");
                    textblock.Text = msg;
                    Storyboard sb = border.Resources["alertStoryboard"] as Storyboard;
                    sb.Begin();
                }
            }
}

這裡有同學可能沒有FindChild方法,這個方法是MahApps.Metro.dll裡的,你當然沒有必要為了這一個方法去引用這個dll,VisualTreeHelper什麼的也是可以實現查詢子元素父元素的。

上一下效果圖:
這裡寫圖片描述

相關推薦

WPF全域性視窗錯誤提示

不管是CS還是BS,在需要使用者提交資料的頁面上,總是要做一些校驗,如果校驗有錯就要給使用者提示,WPF裡自然也避免不了這個問題。一開始,我是在視窗上預留了一個TextBlock,並且設定其Visibility=Collapsed,當校驗有錯的時候,再把這個Te

VS2008 錯誤提示不見了?

1.vs.net 把編譯的錯誤提示框 扣掉後怎麼找回miscrosoft visual studio do not show this dialog again在tools--->options--->projects and solutoins---->build and run ----

PLSQL登入失敗出現空白錯誤提示的問題

電腦重做系統後,不想再安裝資料庫,於是採用instantclient_12_1包免裝資料庫的方式連線ORACLE.安裝配置完成後登入PLSQL,報錯無oraons.dll檔案。(沒有截圖,從網上找了一個,但是報錯情況類似)按照網上大神的意見,從網上下載了oraons.dll檔

WPF 中TextBox 增加輸入檢測,錯誤提示

textbox eight 代碼 alt 自帶 align 信息保存 http validate 先來總結下實現錯誤提示功能的幾個要點 1:binding 的ValidationRules 2 :Validation.ErrorTemplate 首先我們在界面添加一個T

vue全域性提示元件

一. 先寫一個普通的vue元件 檔案位置 /src/toast/toast.vue <template>   <div class="wrap">我是彈窗</div> </template> <style sco

Wpf 系統異常提示

原始碼: wpf頁: <Window x:Class="Wpf.MessageBox1"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pre

Vue全域性錯誤提示的一點思考

我在寫程式碼的時候,很討厭寫異常路徑的各種解決辦法,最好的一直都是走happy path。 在寫Vue的時候,網路請求部分往往需要處理成功部分,失敗部分,不管成功還是失敗都要執行的部分。js有關鍵字async和await,可以解決部分非同步回撥的問題,當然也就無法像之前xx.then()

JS彈出、對話方塊、提示,JS關閉視窗、關閉頁面和JS控制頁面跳轉

1. RequestDispatcher.forward() 在伺服器端起作用,當使用forward()時,Servlet engine傳遞HTTP請求從當前的Servlet或者是JSP到另外的一個Servlet、JSP 或普通HTML檔案,也即你的form提交至a.jsp,在a.jsp用到了forw

salesforce 錯誤提示視窗

ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, '提示訊息'));效果圖 ApexPages.addMessage(new ApexPages.Message(ApexPages.S

webstorm 打開後 一直停留在scanning files to index....,或跳出內存不夠的提示

tez jsb code ont 點擊 pst == sta fcm 用著有時會這樣,超級卡, 網上搜了下,原來如此,記錄下,免得忘了。 ------------------------- 說明: 在npm install 後,會出現Scanning files to in

rhel 7 本地源錯誤提示解決方式

rhel7 錯誤提示 本地源rhel 7 本地源錯誤提示解決方式Repository ‘rhel-7-local-source‘: Error parsing config: Error parsing "gpgkey = ‘file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat

替代alert的消息提示

模式 back -h div osi lose body 由於 conf   alert提示框由於外觀不太友好,所以一般都不用alert了。   我在這裏使用bootstrap的樣式,寫了一個可以單獨顯示消息,也可以確認取消的提示框。   使用的外觀如下:   一:單獨顯示

高級控件【安卓5】——信息提示、對話

make 安卓 com log list 股市 message bundle gif Toast信息提示框 1 Button bt1=(Button)findViewById(R.id.Tbt01); 2 Button bt2=(Button)findViewByI

NPOI操作Excel 004:寫入空Excel(添加保存提示)

tail table add 內容 int null wro appdomain weight 前文說道寫入excel的樣例,當中保存Excle後須要添加提示框。讓用戶自己選擇保存路徑,做改動例如以下。引用的dll等前面已經說過了,直接看代碼: protec

js彈出、對話提示、彈窗總結

js彈出框、對話框、提示框、彈窗總結一、JS的三種最常見的對話框//====================== JS最常用三種彈出對話框 ======================== //彈出對話框並輸出一段提示信息 function ale() { /

項目發布後遇到的錯誤提示歸類

由於 不能 delete 時間 entity 無法找到 不可用 對話框 用戶名 1: HTTP 400-請求無效 2: Http 401.1-未授權:登錄失敗   Http 401.2-未授權:服務器配置問題導致登錄失敗   Http 401.3-ACL禁止訪問資源   H

vue.js插件提示模板寫法

一段 ssa show info methods ring ams spa regex <template> <el-button type="text" @click="open4">點擊打開 Message Box</el-button

Tooltip(提示)組件

() event easy 允許 元素 eas log options troy <!DOCTYPE html> <html> <head> <title>jQuery Easy

python2 安裝scrapy出現錯誤提示解決辦法~

man 提示 正常 html中 command fail 重新 解決問題 資料 首先:set STATICBUILD=true && pip install lxml 安裝環境: windows7操作系統,已經正確安裝python,pip. 使用

JSP_錯誤提示_友好頁面

encoding ise 應用名稱 ava ror xsd sch jsp 應用 示例1:(涉及到請求轉發) 1.jsp----------------errorPage="/error.jsp"請求轉發不需要寫web應用名稱 1 <%@ page langu