深入解析:打造自动消失的对话框
本文导语: 原理:使用Popup控件,并且设置Popup控件的位置居中。 1:新建自定义控件PopupBorder,作为Popup的child。代码如下: 代码如下: ...
原理:使用Popup控件,并且设置Popup控件的位置居中。
1:新建自定义控件PopupBorder,作为Popup的child。代码如下:
This is a Simple Example
新建PopupDemo页面,代码如下:代码如下:
后台cs代码为:代码如下:
private void ShowPopup_Clicked(object sender, RoutedEventArgs e)
{
Popup popup = new Popup();//设置popup的Child属性为自定义的用户控件。
popup.Child = new PopupBorder();
popup.IsOpen = true;
}代码如下:
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);
};
完整的代码如下:代码如下:
PopupBorder pborder = new PopupBorder();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中增加定时器代码:
代码如下:
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);
};
在过了500秒后,将popUp. IsOpen设置为false。运行可以发现窗口可以自动消失了。
可以看到弹出窗口一下就关闭了,那么能不能慢慢的渐变的消失呢??
为了实现渐变的消失,那么就应该使用动画了。
首先在PopupBorder中增加
代码如下:
当然上面的PopupBorder代码中已经有了这段代码了,动画使用了DoubleAnimation,设置LayoutRoot 对象的Opacity属性在1秒的时间内从1,变到0。接着在PopupDemo页面的按钮事件里面在popUp.Child = pborder;后面增加如下代码来执行动画:
代码如下:
//设置popup的Child属性为自定义的用户控件。
popUp.Child = pborder;pborder.myStoryboard.Completed += delegate
{
popUp.IsOpen = false;
};
pborder.myStoryboard.Begin();
然后将Clicked中的代码进行重构。新建MessageBoxHelper类:
代码如下:
代码如下:
public class MessageBoxHelper
{
#region 提示消?息¡é///
/// 弹出提示消息标题为提示,按钮为确定
///
///
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;}
///
/// 弹出提示消息按钮为确定
///
///
public static void ShowMessage(string msg, string title)
{
ShowMessage(msg, title, MessageBoxButton.OK);
}///
/// 弹出提示消息
///
///
public static void ShowMessage(string msg, string title, MessageBoxButton buttons)
{
MessageBox.Show(msg, title, buttons);
}#endregion
}
使用的时候只需要MessageBoxHelper.ShowMessage(“Hello World”);就可以了。注意别忘记了PopupBorder控件。