-
C#教程之深入解析:打造自动消失的对话框
原理:使用Popup控件,并且设置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页面,代码如下:
//设置popup的Child属性为自定义的用户控件。 popup.Child = new PopupBorder(); popup.IsOpen = true; }
Popup popUp = new Popup();
//设置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;
要想自动消失还得使用定时器,过了一段时间后定时器将popUp控件的 IsOpen属性设置为false,这样窗口就关闭了。
于是在LayoutUpdated中增加定时器代码:
System.Threading.Timer timer = new System.Threading.Timer( (state) => { popUp.Dispatcher.BeginInvoke(() => { popUp.IsOpen = false; }); }, null, 500, 500); };
运行可以发现窗口可以自动消失了。
可以看到弹出窗口一下就关闭了,那么能不能慢慢的渐变的消失呢??
为了实现渐变的消失,那么就应该使用动画了。
首先在PopupBorder中增加
接着在PopupDemo页面的按钮事件里面在popUp.Child = pborder;后面增加如下代码来执行动画:
pborder.myStoryboard.Completed += delegate { popUp.IsOpen = false; }; pborder.myStoryboard.Begin();
新建MessageBoxHelper类:
代码如下:
/// <summary> /// 弹出提示消息标题为提示,按钮为确定 /// </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 }