a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

深入解析:打造自動消失的對話框

2020-01-24 03:20:43
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永久在线 | 国产精品自产拍在线观看桃花 | 国产精品高潮呻吟久久久 | av黄色在线 | 毛片网站免费观看 | 天天干夜夜拍 | 精品电影| 精品久久久久久久久久久久久久 | 欧美激情一区二区三区在线观看 | 国产精品欧美久久久久一区二区 | 91看片在线观看 | 秋霞毛片| 91在线视频观看 | 中文字幕第二十六页页 | 国产精品久久久久久久久久 | 日韩一区二区中文字幕 | 犬夜叉在线观看 | 国产不卡在线 | 日韩精品视频国产 | 亚洲欧美另类久久久精品2019 | 久久99精品久久久久久琪琪 | 激情欧美一区二区三区中文字幕 | 国产xxx护士爽免费看 | 久久精品1 | 欧美乱轮 | 国产一区二区三区精品久久久 | av在线一区二区三区 | 亚洲永久免费 | 国产精品自产av一区二区三区 | 亚洲欧美另类在线 | 99精品国产高清在线观看 | 精品久久网 | 成人久久 | 97人人超碰| 精品一区国产 | 色噜噜视频在线观看 | 日日摸天天爽天天爽视频 | 欧美一区二区三区四区视频 | 国产精品一区二区免费 | 成人国产精品久久 | 中文字幕视频在线 |