• 完全详解打造自动消失的对话框


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

     

    运行,效果如下:

    clip_image002
     

    注册popUp的LayoutUpdated事件,在触发LayoutUpdated事件时,设置popUp的Margin属性:

    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控件。

  • 相关阅读:
    codeblocks-17.12mingw-nosetup(mingw编译,绿色免安装版)的下载、安装及设置一
    我的Qt历程1:第一个Qt程序
    单一职责-依赖倒转-代理模式-迭代器模式等
    结合你以往的工作经验谈谈高并发应用的性能优化措施
    如何优化数据库,如何提高数据库的性能?
    在一个千万级的数据库查询中,如何提高查询效率?
    如何提高页面的显示速度?假如一个页面的加载时间是10.89s,你会用什么方式进行优化?
    强制提高网站性能有什么办法
    简述httpModule与HttpHandler
    EntityFramework的效率与ADO.Net的效率哪个高?
  • 原文地址:https://www.cnblogs.com/LoveJenny/p/2105869.html
Copyright © 2020-2023  润新知