深入解析:打造自動(dòng)消失的對(duì)話框
原理:使用Popup控件,并且設(shè)置Popup控件的位置居中。
1:新建自定義控件PopupBorder,作為Popup的child。代碼如下:
<UserControl x:Class="SLStudy.PopupBorder"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<UserControl.Resources>
<Storyboard x:Name="myStoryboard">
<DoubleAnimation
Storyboard.TargetName="LayoutRoot"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0" Duration="0:0:1"
AutoReverse="True" />
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" >
<!--<Border Background="#FFCC0D0D" BorderThickness="0" CornerRadius="5">-->
<Border BorderThickness="0" CornerRadius="5">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF27A3D7" Offset="0.51"/>
<GradientStop Color="#FF76C2E1" Offset="0.004"/>
<GradientStop Color="#FF27A3D7" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<Border.Effect>
<DropShadowEffect BlurRadius="10" Color="#FFCC0D0D" ShadowDepth="0"/>
</Border.Effect>
<TextBlock x:Name="txtMessage" HorizontalAlignment="Center" Margin="10" VerticalAlignment="Center"
FontSize="28" Foreground="White" FontFamily="Comic Sans MS"
>This is a Simple Example</TextBlock>
</Border>
</Grid>
</UserControl>
新建PopupDemo頁(yè)面,代碼如下:復(fù)制代碼 代碼如下:
<Grid x:Name="LayoutRoot">
<StackPanel>
<Button Content="Show" Click="ShowPopup_Clicked"></Button>
</StackPanel>
</Grid>
后臺(tái)cs代碼為:復(fù)制代碼 代碼如下:
private void ShowPopup_Clicked(object sender, RoutedEventArgs e)
{
Popup popup = new Popup();//設(shè)置popup的Child屬性為自定義的用戶控件。
popup.Child = new PopupBorder();
popup.IsOpen = true;
}復(fù)制代碼 代碼如下:
popUp.LayoutUpdated += delegate
{
popUp.Margin = new Thickness(
(App.Current.Host.Content.ActualWidth - pborder.ActualWidth) / 2,
(App.Current.Host.Content.ActualHeight - pborder.ActualHeight) / 2,
0,
0);
};
完整的代碼如下:復(fù)制代碼 代碼如下:
PopupBorder pborder = new PopupBorder();Popup popUp = new Popup();
//設(shè)置popup的Child屬性為自定義的用戶控件。
popUp.Child = pborder;
popUp.LayoutUpdated += delegate
{
popUp.Margin = new Thickness(
(App.Current.Host.Content.ActualWidth - pborder.ActualWidth) / 2,
(App.Current.Host.Content.ActualHeight - pborder.ActualHeight) / 2,
0,
0);
};
popUp.IsOpen = true;
運(yùn)行可以發(fā)現(xiàn)彈出的消息已經(jīng)居中了,那么如何讓它自動(dòng)消失呢??,要想自動(dòng)消失還得使用定時(shí)器,過(guò)了一段時(shí)間后定時(shí)器將popUp控件的 IsOpen屬性設(shè)置為false,這樣窗口就關(guān)閉了。
于是在LayoutUpdated中增加定時(shí)器代碼:
復(fù)制代碼 代碼如下:
popUp.LayoutUpdated += delegate
{
popUp.Margin = new Thickness(
(App.Current.Host.Content.ActualWidth - pborder.ActualWidth) / 2,
(App.Current.Host.Content.ActualHeight - pborder.ActualHeight) / 2,
0,
0);System.Threading.Timer timer = new System.Threading.Timer(
(state) =>
{
popUp.Dispatcher.BeginInvoke(() =>
{
popUp.IsOpen = false;
});
}, null, 500, 500);
};
在過(guò)了500秒后,將popUp. IsOpen設(shè)置為false。運(yùn)行可以發(fā)現(xiàn)窗口可以自動(dòng)消失了。
可以看到彈出窗口一下就關(guān)閉了,那么能不能慢慢的漸變的消失呢??
為了實(shí)現(xiàn)漸變的消失,那么就應(yīng)該使用動(dòng)畫了。
首先在PopupBorder中增加
復(fù)制代碼 代碼如下:
<UserControl.Resources>
<Storyboard x:Name="myStoryboard">
<DoubleAnimation
Storyboard.TargetName="LayoutRoot"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0" Duration="0:0:1"
AutoReverse="True" />
</Storyboard>
</UserControl.Resources>
當(dāng)然上面的PopupBorder代碼中已經(jīng)有了這段代碼了,動(dòng)畫使用了DoubleAnimation,設(shè)置LayoutRoot 對(duì)象的Opacity屬性在1秒的時(shí)間內(nèi)從1,變到0。接著在PopupDemo頁(yè)面的按鈕事件里面在popUp.Child = pborder;后面增加如下代碼來(lái)執(zhí)行動(dòng)畫:
復(fù)制代碼 代碼如下:
//設(shè)置popup的Child屬性為自定義的用戶控件。
popUp.Child = pborder;pborder.myStoryboard.Completed += delegate
{
popUp.IsOpen = false;
};
pborder.myStoryboard.Begin();
然后將Clicked中的代碼進(jìn)行重構(gòu)。新建MessageBoxHelper類:
代碼如下:
復(fù)制代碼 代碼如下:
public class MessageBoxHelper
{
#region 提示消?息¡é/// <summary>
/// 彈出提示消息標(biāo)題為提示,按鈕為確定
/// </summary>
/// <param name="msg"></param>
public static void ShowMessage(string msg)
{
//ShowFriendMessage(msg, "提示", MessageBoxButton.OK);PopupBorder pborder = new PopupBorder();
pborder.txtMessage.Text = " " + msg + " ";pborder.UpdateLayout();
Popup popUp = new Popup();
popUp.Child = pborder;
pborder.myStoryboard.Completed += delegate
{
popUp.IsOpen = false;
};
pborder.myStoryboard.Begin();
popUp.InvokeOnLayoutUpdated(() =>
{
popUp.Margin = new Thickness(
(App.Current.Host.Content.ActualWidth - pborder.ActualWidth) / 2,
(App.Current.Host.Content.ActualHeight - pborder.ActualHeight) / 2,
0,
0);System.Threading.Timer timer = new System.Threading.Timer(
(state) =>
{
popUp.Dispatcher.BeginInvoke(() =>
{
popUp.IsOpen = false;
});
}, null, 500, 500);
});
popUp.IsOpen = true;}
/// <summary>
/// 彈出提示消息按鈕為確定
/// </summary>
/// <param name="msg"></param>
public static void ShowMessage(string msg, string title)
{
ShowMessage(msg, title, MessageBoxButton.OK);
}/// <summary>
/// 彈出提示消息
/// </summary>
/// <param name="msg"></param>
public static void ShowMessage(string msg, string title, MessageBoxButton buttons)
{
MessageBox.Show(msg, title, buttons);
}#endregion
}
使用的時(shí)候只需要MessageBoxHelper.ShowMessage(“Hello World”);就可以了。注意別忘記了PopupBorder控件。
相關(guān)文章
ASP.NET總結(jié)C#中7種獲取當(dāng)前路徑的方法
本文主要介紹了7種獲取當(dāng)前路徑的方法,并做了代碼演示,分享給大家,感興趣的朋友可以參考一下。2016-03-03VS2012 未找到與約束ContractName匹配的導(dǎo)出
這篇文章主要介紹了在更新的windows補(bǔ)丁后,Visual Studio 用戶可能無(wú)法打開或創(chuàng)建 C++ 或 JavaScript 文件或項(xiàng)目,小編的解決辦法,希望可以幫助到大家2018-04-04C#獲取存儲(chǔ)過(guò)程返回值和輸出參數(shù)值的方法
這篇文章主要介紹了C#獲取存儲(chǔ)過(guò)程返回值和輸出參數(shù)值的方法,有需要的朋友可以參考一下2014-01-01解析從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制的詳解
本篇文章是對(duì)從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法
這篇文章主要介紹了C#實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳下載的方法,涉及網(wǎng)絡(luò)文件操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05C#備忘錄人生存檔的設(shè)計(jì)模式實(shí)例
這篇文章主要為大家介紹了C#設(shè)計(jì)模式中備忘錄模式的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06