在WPF中仿制QQ2013登录窗口的关闭效果

昨天,有位朋友问我,WPF能做出像QQ2013窗口在关闭时那个貌似透明过渡的动画吗?我就歪着脸跟他说:"只有你想不到的,没有WPF做不到的"。

他又接着说:"我知道肯定会用到动画来控制画刷,但是那个透明的'淡出'怎么弄呢?"

我就给他演示了一个类似的效果。

大家有没有注意到System.Windows.UIElement.OpacityMask这个属性,它是一个Brush类型,也就是说,你可以使用任意Brush的类来充当。这个属性只提取赋给它的Brush中的所有颜色的A值。即ARGB中的A值,其他通道将忽略,然后用这些不透明值来替目标可视化元素中的不透明值。具体大家可参考MSDN。

其实原理非常简单,就以下两个条件:一是把窗口变成透明,这个不介绍,大家可以看我后面贴的代码。第二就是OpacityMask属性用渐变画刷,只有这样才能做到渐变透明的效果。然后我们就对这个渐变画刷中各颜色点的Offset进行动画处理就可以了。

先看看最终效果,看看像不像,呵呵。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/

原理很easy,我就放XAML了。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="300"
        AllowsTransparency="True" Background="Transparent" WindowStyle="None"
        WindowStartupLocation="CenterScreen">
    <Grid x:Name="layoutroot">
        <Grid.OpacityMask>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FF000000" Offset="0" />
                <GradientStop Color="#FF000000" Offset="1" />
                <GradientStop Color="#FF000000" Offset="1" />
            </LinearGradientBrush>
        </Grid.OpacityMask>
        <Grid.Clip>
            <EllipseGeometry Center="150 150" RadiusX="150" RadiusY="150" />
        </Grid.Clip>
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FF4141A6" Offset="0.003" />
                <GradientStop Color="#FF5E5ED4" Offset="1" />
                <GradientStop Color="#FFDCDCFD" Offset="0.38" />
                <GradientStop Color="#FF161674" Offset="0.84" />
            </LinearGradientBrush>
        </Grid.Background>
        <Button Content="关闭" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="20" Background="#FFF70D0D" Foreground="White" BorderBrush="#FFD8A00A" FontSize="28" Click="OnClick">
            <Button.Template>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Ellipse x:Name="bg" Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="2"  />
                        <Ellipse x:Name="fr" Opacity="0" >
                            <Ellipse.Fill>
                                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                    <GradientStop Color="#CCFFFFFF" Offset="0" />
                                    <GradientStop Offset="1" />
                                    <GradientStop Color="#7FFFFFFF" Offset="0.392" />
                                </LinearGradientBrush>
                            </Ellipse.Fill>
                        </Ellipse>
                        <ContentPresenter x:Name="ContentPresenter" Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="UIElement.IsMouseOver" Value="True" >
                            <Setter TargetName="fr" Property="Opacity" Value="1" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Button.Template>
        </Button>
        <Grid.Resources>
            <Storyboard x:Key="std">
                <DoubleAnimation From="1" To="0" Duration="0:0:6"
                                 Storyboard.TargetName="layoutroot"
                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].Offset" />
                <DoubleAnimation Duration="0:0:4.5" BeginTime="0:0:1.5" From="1" To="0"
                                 Storyboard.TargetName="layoutroot"
                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[2].Offset" />
                <ColorAnimation Duration="0" To="#00000000" Storyboard.TargetName="layoutroot"
                                 Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[2].Color" />
            </Storyboard>
        </Grid.Resources>
    </Grid>
</Window>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索动画
, 透明
, 属性
, 窗口
, 效果
, WPF 背景透明
Brush
wpf qq聊天窗口、wpf qq聊天窗口样式、wpf窗口动画效果、wpf 窗口打开效果、qq窗口毛玻璃效果,以便于您获取更多的相关知识。

时间: 2024-05-21 14:38:47

在WPF中仿制QQ2013登录窗口的关闭效果的相关文章

winform-Winform中如何保持登录窗口在主窗口的前面

问题描述 Winform中如何保持登录窗口在主窗口的前面 Winform中如何保持登录窗口在主窗口的前面,并且只有输入了正确的密码,才能切换掉主窗口? 解决方案 窗体.ShowDialog() 解决方案二: 一般是通过登录窗口验证到主窗口的,为何要保持在前面 解决方案三: 参考winform登陆后关闭登录窗口跳转到主窗体 解决方案四: 先做个你想要提前显示的窗体,然后用这个窗体类在form_load函数中创建对象,然后显示这个窗体即可.

open-如何在当前窗口中捕获新打开窗口的关闭事件

问题描述 如何在当前窗口中捕获新打开窗口的关闭事件 如何在当前窗口A中捕获新打开窗口B的关闭事件 只能操作窗口A

关于在global.asax中定位到登录窗口(dl.aspx)的问题

问题描述 我自做的一个登录窗口dl.aspx,我想在session过期时定位到dl.aspx页面,我在global.asax中的voidSession_End(objectsender,EventArgse)事件里写如下代码怎不能定位请高手指点,会话模式已设为InProcvoidSession_End(objectsender,EventArgse){//在会话结束时运行的代码.//注意:只有在Web.config文件中的sessionstate模式设置为//InProc时,才会引发Sessio

window-如何改变登录窗口的风貌?

问题描述 如何改变登录窗口的风貌? 请问各位专家,在window10系统中,制作登录窗口的时候,如何改变登录窗口的风貌呢? 解决方案 最简单的做法是去掉标题栏,贴图实现自己的标题栏以及窗口边框. 解决方案二: 改变窗口的图标随心所欲改变窗口的图标 解决方案三: 用无边框窗口,然后自绘.

WPF中反转3D列表项

记得在苹果电脑中有一个很酷的3D旋转效果, 它可以将某项的正反面进行反转, 在WPF中可以很轻松地做到该效果. 点击查看 : http://www.interact-sw.co.uk/wpfapps/FlipList.xaml 也可以粘贴此代码XamlPad中查看: <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;a

WPF中的Style(风格,样式)

在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而不必分别设置每个按钮的风格. Style是作为一种资源被保存下来的. 看下面的例子: <Window.Resources>        <Style TargetType="Button">       <Setter Property="Fore

WinForm程序中使用控制台作为输出窗口

Lambda表达比代表定义和带外方法定义的结合更清楚,且相关的额外工作只需要满足语言定义即可.不过,它也有一些不足之处.如果某个方法的参数包含System.Delegate 这样的抽象类型,用lambda表达式介绍特殊的问题:C#编译器不能将lambda表达式转换成还未明确定义的衍生代表类型. 如果不仔细思考一下,你的代码看上去就会像是来自.NET1.0的东西.在本文中,我将告诉告诉你为什么lambda表达式不足以被直接转换成抽象代表类型,并且教你怎样使得编译器转换你所定义的指定代表.解决方案依

在Windows Vista中使用经典登录界面

对于习惯了使用Windows 2000 与 Windows XP 经典登录方式--登录时需要输入用户名与密码--的用户而言,可能会感到Windows Vista中使用欢迎屏幕登录的方式有点别扭,而且,与Windows XP不同的是,在Windows XP中,用户可以直接修改登录方式, 从欢迎屏幕登录切换到经典登录方式,而在Windows Vista中则没有相应的选项,用户默认只能使用欢迎屏幕登录.(注:除非Windows Vista作为域成员,在连接到域时会提供经典登录界面 .) 当然,如果您仍

在WPF中自定义你的绘制(五)

将我们的绘制转变为画刷 WPF中的画刷比GDI+中要强大得多,除了常用的实心画刷.渐变画刷外,还支持更多的平铺画刷,这包括DrawingBrush.ImageBrush.VisualBrush,其中DrawingBrush使得我们可以将自定义的绘制用于任何可以使用普通画刷的地方. 比如下面的代码,我们将自定义一个椭圆和一个矩形,然后将它们合并成一个图形并将 改图形用作窗口的背景画刷: public Window1() { InitializeComponent(); //background E