深入解析:打造自动消失的对话框

 更新时间:2013年05月13日 18:09:50   作者:  
本篇文章是对打造自动消失的对话框进行了详细的分析介绍,需要的朋友参考下

原理:使用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>


image 

新建PopupDemo页面,代码如下:

复制代码 代码如下:

<Grid x:Name="LayoutRoot">
        <StackPanel>
            <Button Content="Show" Click="ShowPopup_Clicked"></Button>
        </StackPanel>
    </Grid>

后台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中增加

复制代码 代码如下:

<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>

当然上面的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 提示消?息¡é

    /// <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
}


使用的时候只需要MessageBoxHelper.ShowMessage(“Hello World”);就可以了。注意别忘记了PopupBorder控件。

相关文章

  • C#实现冻结Excel窗口以锁定行列或解除冻结

    C#实现冻结Excel窗口以锁定行列或解除冻结

    在处理大型Excel工作簿时,有时候我们需要在工作表中冻结窗格,这样可以在滚动查看数据的同时保持某些行或列固定不动,下面我们就来看看如何使用C#实现冻结Excel窗口吧
    2024-04-04
  • C#中的Linq Intersect与Except方法使用实例

    C#中的Linq Intersect与Except方法使用实例

    这篇文章主要介绍了C#中的Linq Intersect与Except方法使用实例,本文直接给出示例代码,需要的朋友可以参考下
    2015-06-06
  • Unity打包代码到DLL的实现

    Unity打包代码到DLL的实现

    本文主要介绍了Unity打包代码到DLL的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • C#实现动态图标闪烁显示的示例代码

    C#实现动态图标闪烁显示的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现动态图标闪烁显示的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C#的FileSystemWatcher用法实例详解

    C#的FileSystemWatcher用法实例详解

    这篇文章主要介绍了C#的FileSystemWatcher用法,以实例形似详细分析了FileSystemWatcher控件主要功能,并总结了FileSystemWatcher控件使用的技巧,需要的朋友可以参考下
    2014-11-11
  • Unity Shader实现序列帧动画效果

    Unity Shader实现序列帧动画效果

    这篇文章主要为大家详细介绍了Unity Shader实现序列帧动画效果 ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 直接在线预览Word、Excel、TXT文件之ASP.NET

    直接在线预览Word、Excel、TXT文件之ASP.NET

    这篇文章主要用asp.net技术实现直接在线预览word、excel、txt文件,有需要的朋友可以参考下
    2015-08-08
  • 深入理解C# 委托与事件

    深入理解C# 委托与事件

    本文主要介绍了深入理解C# 委托与事件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2008-05-05
  • 基于不要返回null之EmptyFactory的应用详解

    基于不要返回null之EmptyFactory的应用详解

    本篇文章对不要返回null之EmptyFactory进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#实现人脸识别超简单方法举例

    C#实现人脸识别超简单方法举例

    这篇文章主要给大家介绍了关于C#实现人脸识别的相关资料,文中讲解了在C#中使用EmguCV库进行人脸识别的简单示例,包括安装EmguCV库、准备训练数据、编写代码和运行程序,需要的朋友可以参考下
    2024-11-11

最新评论